Veröffentlicht 22. April 201114 j Hey leute, Ich hab ein kleines Problem beim Lesen aus CSV-Dateien... Also ich habe in die CSV Datei in der ersten Zeile sozusagen eine Sprache gespeichert und dadrunter sollen dann Vokabeln der Sprache stehen. Z.b.: Deutsch | Englisch | Französisch Arbeit | labour | travail ... | .... | ... usw. Jetzt hab ich schon die Spalte rausgefunden, als Zahl also, 2, wenn ich jetzt Englisch haben will. Jetzt will ich alle Vokabeln die unter Englisch stehn aus der Datei lesen und in ein in ein 2D Char Array schreiben nur das krieg ich nicht ganz hin das ich auf die nächste Zeile der Spalte zugreife fprintf(VBListe,"\n%s ; \n%s ; \n%s ; \n%s ; \n%s",ListenInhalt[0],ListenInhalt[1],ListenInhalt[2],ListenInhalt[3],ListenInhalt[4]); Damit kann ich in die erste Spalte unter einander in die Datei schreiben, aber fscanf(VBListe,"\n%s ; \n%s ; \n%s",&ListenInhalt[0],&ListenInhalt[1],&ListenInhalt[2]); Klappt nicht, er liest dann einfach den Inhalt der ersten Zeile Wie krieg ich das jetzt hin? Ich mache das ganze Dateihandling in C! und ja ich WILL char Arrays benutzen... MfG Artery
25. April 201114 j Autor Ich mache es jetzt so das ich die csv datei so anlege das in jeder Zeile nicht wie vorher in jeder Spalte, die Vokabeln der einzelnen Sprachen stehen! Nur eine Frage kann mir jemand bitte zeigen, wie ich ein 2D Char Array anlege?
25. April 201114 j Viele Wege führen nach Rom ;-) Einer dieser könnte so aussehen: int ROWS, LINELEN; ROWS = 1024; LINELEN = 1024; char My2DArray [ROWS][LINELEN]; Diese Informationen möchte ich Dir nahelegen: http://de.wikipedia.org/wiki/C_%28Programmiersprache%29 Bearbeitet 25. April 201114 j von uenetz Noch etwas hinzufügen
25. April 201114 j Autor Upps... Ich hätte vielleicht dazu schreiben sollen das ich es DYNAMISCH anlegen will ja das man so eins anlegt ist mir klar xD, aber ich wollte wissen wie man es dynamisch macht okay habs mit: char** Sprachenbla = new char*[3]; Sprachenbla[0] = new char[10]; hingekriegt dachte erst das geht nicht, weil er mir beim debuggen, wenn ich das Programm anhalte beim überwachen, nicht das komplette array anzeigt sonder nur: - Sprachenbla 0x01e747f0 char * * - 0x01e74838 "sadasdsadsad" char * 115 's' char Bearbeitet 25. April 201114 j von Artery
25. April 201114 j Autor Das mit dem 15 min edit nervt mich :/ Wie kann ich denn jetzt nen 2D char array dynamisch erweitern? Also das ich einfach 1 element noch hinzufüge ohne den Inhalt der schon in den anderen Elementen steht zu löschen?
25. April 201114 j Das mit dem 15 min edit nervt mich :/ Tja, diese Einstellung ist hier schon ein Jahrzehnt aktiv, sie wird nicht für dich geändert werden.
25. April 201114 j Wie kann ich denn jetzt nen 2D char array dynamisch erweitern? Gar nicht, ein Array ist eine statische Größe. Mit C++ kannst Du z.B. std::map / std::vector verwenden. Wenn Du es unter C dynamisch machen willst, dann musst Du komplett selbst mit malloc und realloc den Speicher für ein Element bzw das Array allokieren und dann die Daten anfügen. Beim Beenden des Programms musst Du dann den allokierten Speicher wieder frei geben
25. April 201114 j Du könntest die Sache zu Beginn vereinfachen, und erstmal (z.b. mit fgets) die Zeilen mit einer festen Maximalgröße ein einen Buffer einlesen. Für diesen Buffer, bzw für die Länge des Buffers (des Strings im Buffer, sizeof(buffer) ) Speicher anfordern (realloc) und deine Werte dann speichern. Deinen eingelesenen *Buffer kannst du mit "strtok" in tokens zerlegen. Eine Schönere Variante wäre wenn du beim Einlesen aus der Datei zuerst mal für jeden einzelnen char Speicher anforderst. Wenn du das hast könntest du eine schönere/bessere Version machen und versuchen den Speicher blockweise anzufordern. schau dir die befehle an: malloc realloc fgets getc strtok Ich hoffe dir hilft das weiter.
26. April 201114 j Autor Mmmm... ne das ist mir etwas zu umständlich , da erstelle ich lieber ein neues Array ;D Nur wenn ich jetzt ein Array löschen will geht das ja folgender Maßen: delete[] MeinArray; MeinArray = NULL; wenn ich jetzt nen 2D Array habe, wie mache ich das dann? So? delete[] MeinArray[0]; delete[] MeinArray; MeinArray = NULL;
26. April 201114 j Mmmm... ne das ist mir etwas zu umständlich , da erstelle ich lieber ein neues Array ;D Das nützt Dir aber nichts, denn in dem neuen Arrays sind die alten Daten nicht drin. Wenn musst Du dann die alten Daten vorher kopieren, was bei großen Datenmengen nicht mehr sinnvoll ist und dann letztendlich auf ein realloc hinausläuft
26. April 201114 j Autor Ne also ich mache das so das ich mir ein neues Arrayschaffe mit der passenden Größe, die Daten darein schreibe. Dann lösche und erstelle mein eigentliches Array neu mit der passenden Größe, schiebe die Daten da wieder rein. Und lösche das andere Array wieder jetzt war halt nur meine Frage, wie ich 2D Arrays wieder richtig "lösche"!
26. April 201114 j In meinem letzten Posting habe ich Dich auf eine Quelle hingewiesen, die elementare Dinge zu C gut erklärt. Anstatt hier zu posten, solltest Du Dir vielleicht diese Informationen zu Gemüte führen ;-) Danach sollten all Deine Fragen eigentlich beantwortet sein. Hier noch einmal den Link: C (Programmiersprache) Oder Dir gleich das Buch von Kernighan & Ritchie bestellen ;-) Na denn mal viel Erfolg ;-)
26. April 201114 j Autor Ernsthaft? Was soll ich mit der Website? Ich will 1. keine Informationen über die Geschichte von C und was das ist, 2. Steht da nicht wie ich nun 2D Arrays richtig "lösche", ich weiß wie man wieder speicher frei gibt, wollte aber einfach wissen, ob das bei 2D arrays genau so ist oder ob das etwas anders geht... Und da brauche ich so ne website nicht!
26. April 201114 j Und da brauche ich so ne website nicht! Doch, denn da steht genau das drin, was Du wissen möchtest. Kleiner Tipp: Gültigkeit von Variablen ;-) Mehr ist dazu nicht mehr zu nenne. Viel Erfolg!
27. April 201114 j jetzt war halt nur meine Frage, wie ich 2D Arrays wieder richtig "lösche"!Gar nicht. Du kannst zweidimensionale Arrays nicht dynamisch anlegen, also brauchst du sie auch nicht zu löschen. Was du dynamisch anlegen kannst, sind Zeiger-Arrays, bei denen wiederum jeder Zeiger auf ein eigenes Array zeigt. Das fühlt sich in der Benutzung so an wie ein 2D-Array, aber es ist nach wie vor eine Menge von 1D-Arrays, die du genau wie sonst auch behandeln kannst. Wenn du für jeden einzelnen Zeiger in deinem Zeiger-Array Speicher geholt hast, musst du auch jeden einzelnen Zeiger wieder freigeben. Zu jedem malloc gehört ein free.
27. April 201114 j http://www.fachinformatiker.de/c-c/62132-faq-vorschlag-dynamische-speicherverwaltung-c.html
27. April 201114 j Mit delete[] gibst du frei, was du mit new[] angefordert hast. Das gibt's nur in C++. Mit free gibst du frei, was du mit malloc angefordert hast. Das gibt's in C und in C++.
27. April 201114 j Autor achso k, also wenn ich jetzt das ganze über new[] gemacht habe reicht das mit delete[] ja aus! Nur nochmal ne Frage muss ich dann einfach nur folgendes machen: delete[] NewSprachenArrayTmp; NewSprachenArrayTmp = NULL; wenn ich folgend das angelegt habe? NewSprachenArrayTmp = new char*[SprachenAnzahl]; NewSprachenArrayTmp[i] = new char [20];
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.