Einlesen von Dateien mit ifstream klappt nicht
-
ofstream FileOut; FileOut.open("/home/matthias/Documents/Dev/streams/ausgabe.dat"); FileOut.flags(ios::right); if (FileOut) { for (int i=0; i<=10; i++) { FileOut << hex << setw(5) << i << endl; cout << hex << setw(5) << i << endl; } } else { cout << "Datei konnte nicht geöffnet werden" << endl; } FileOut.close(); ifstream FileIn; FileIn.open("/home/matthias/Documents/Dev/streams/ausgabe.dat"); FileIn.flags(ios::right); int ibuff; if (FileIn) { int i=0; while (!FileIn.eof()) { i++; FileIn >> hex >> ibuff; cout << dec << i << " "; cout << hex << setw(5) << ibuff << endl; } FileIn.close(); }gibt mir eine Datei mit dem Inhalt (mit 4 Leerzeichen vor den Zahlen!)
0
1
2
3
4
5
6
7
8
9
aBeim Einlesen bekomme ich jedoch unsinnige riesige Werte und das Programm bricht nicht ab, zählt also i in die zig-tausende hoch.
Was ist falsch ? Und was wird überhaupt eingelesen ?
Matthias
-
Erstens: Die Ausrichtung ist für einen Eingabe-Stream irrelevant.
Zweitens: Die beschriebene Ausgabe passt doch genau zu deinem Quelltext - du gibst die Zahlen 0 bis 10 rechtsbündig mit 5 Zeichen Breite aus.
Drittens: Eventuell solltest du auch Einlese-Fehler abfangen

-
CStoll schrieb:
Erstens: Die Ausrichtung ist für einen Eingabe-Stream irrelevant.
Ok
CStoll schrieb:
Zweitens: Die beschriebene Ausgabe passt doch genau zu deinem Quelltext - du gibst die Zahlen 0 bis 10 rechtsbündig mit 5 Zeichen Breite aus.
Schon klar.
CStoll schrieb:
Drittens: Eventuell solltest du auch Einlese-Fehler abfangen

Das war der Kern der Frage - wie Fange ich ab, dass FileIn.eof() nie zutrifft ? Und warum kann das passieren ?
Matthias
-
pospiech schrieb:
Und warum kann das passieren ?
Weil du nie erfolgreich einliest. Jeder Einlesevorgang schlägt fehl, das Dateiende wird nie erreicht.
eof ist als Schleifenbedingung sowieso ungeeignet, weil es erst dann true liefert, wenn schon ein Einlesevorgang fehlgeschlagen ist. Benutz einfach deinen Einleseausdruck (FileIn >> hex >> ibuff) als Schleifenbedingung.