Probleme mit Dateieinlesen über ifstream



  • Hallo zusammen, ich habe hier bei meinem aktuellen Projekt einige Probleme, mit denen ich einfach nicht klar komme, obwohl der code unglaublich einfach ist, und eigentlich nix schief gehen sollte.

    Vereinfacht gesagt will ich Daten aus einer Datei auslesen, hab das probeweise mal mit einer einfachen txt nachgestellt die folgenden Inhalt halt:

    abc
    defghijkl
    mnopqrstuvw
    xyz

    Nun versuche ich die Datei mit folgenden Code auszulesen und den Inhalt in ein char Array zu speichern, damit ich damit später arbeiten kann, das ganze sieht dann so aus:

    ifstream f(".../bla.txt");
    
        f.seekg(0,ios::end);
    
        size_t t= f.tellg();  // 32
    
        char array[t];
    
        f.seekg(0,ios::beg);
    
        f.read(array,t);
    
        cout << "Inhalt: " << array << endl;
    

    Nun wird aber am Ende bei der Ausgabe nicht einfach der Text ausgegeben wie er ind er Textdatei steht, sondern am Ende werden noch zwei Hyroglyphen angefügt. Wenn ich die Zeile

    char array[t];
    

    durch

    char *array = new char[t];
    

    ersetze, bekomme ich sogar noch mehr Hyroglyphen am Ende.

    Das Schlimme ist, bei meinem eigentlich Projekt (das hier war nur mal ein Beispielcode der den selben Fehler in abgeschwächter Form erzeugt), hat dieser Fehler noch viel schlimmerer Auswirkungen, und die Daten im Array scheinen gegen Ende völlig durcheinander zu geraten.

    Übrigens, wenn iech hdas Sctriingende Zeichen '\0' manuell an die vorvorletzte position im Array setze, wird alles wie gewünscht ausgegeben, nur ist das Problem eben dass mir tellg() ja eigentlich ne andere Position für das Stingende angibt, und ich mich so eigentlich darauf verlassen muss.

    Vielleicht weiß ja jemand von euch wie ich damit zurechtkommen kann.

    Vielen Dank schon mal

    Mfg Felsen



  • Vorab:
    Initialisier das Array mal mit Nullen.

    char array[t] = {0};
    

    Zum Problem:
    Ich denke es liegt an dem EOF Zeichen, dass du mit einliest.



  • feraL schrieb:

    Vorab:
    Initialisier das Array mal mit Nullen.

    char array[t] = {0};
    

    Zum Problem:
    Ich denke es liegt an dem EOF Zeichen, dass du mit einliest.

    Naja nicht gerade die Beste Lösung.
    @Felsen Du bist in einem C++ Forum und benutzt auch C++ Mittel, warum führst du das nicht weiter, und lässt die Finger von char zeigern und char-arrays? Nimm doch einfach std::string zum einlesen und zum temporären speichern nimmst du std::vectorstd::string
    und zum lesen der Datei nicht unbedingt seekg und read nehmen wenn du nicht gezwungen bist es binär einzulesen. Sondern dafür einfach den Stream nehmen oder getline



  • ifstream f("bla.txt"); 
    
        f.seekg(0,ios::end); 
    
        size_t t = f.tellg()+1;     // ! 
    
    	// char array[t]; Fehler! t ist keine Konstante
        char* array = new char[t]();  // Die runden Klammern bewirken,
    	                              // das das Array mit Nullen initialisiert wird.
    								  // Da Du nur eine abschliessende 0 brauchst,kannst
    	                              // Du auch char* array = new char[t]; array[t-1] = 0;  schreiben.
    
        f.seekg(0,ios::beg); 
    
        f.read(array,t-1); // !
    
        cout << "Inhalt: " << array << endl;
    

    😉



  • Hi erst mal Danke für die schnelle Hilfe 🙂

    @feraL

    Dein Code funktioniert leider nicht, weil t zum dem Zeitpunkt noch nicht feststeht, und somit auch nichts mit 0 initialisiert werden kann. So sagts zumindest der Compiler und logisch is es ja auch.

    @Firefighter

    Da hast du schon recht, hab in der Zwischenzeit eine alternativ Version mit vector und string geschrieben die auch funktioniert. Habe nur ein paar Bedenken weil da ja doch schon ziehmlich viel Rechenaufwand betrieben wird, und ich die Laufzeit nicht unnötig nach oben treiben will. Schließlich ist das konvertieren einer Zeichenkette in einen String, den String in den Vector packen, bei Bedarf dann noch neuen Vector Speicherplatz reservieren etc. doch zeitaufwändiger, als einfach mit meinem char Zeiger durch das Array zu flitzen.
    Aber so hab ich jetzt jedenfalls auch noch nen Plan B in der Tasche, und in dem Punkt hast du recht, eleganter siehts so wirklich aus.

    @emmax

    WOW! Ich verstehe zwar nicht genau wieso das jetzt funktioniert, denn du machst das Array ja nur um eins größer als tellg() sagt, und dann eben noch entsprechend der Kniff bei read. Aber letzten Endes funktionierts genau so wie ich mir das vorgestellt habe, und das ist die Hauptsache. 😉

    Also vielen Dank euch allen

    Mfg Felsen


Anmelden zum Antworten