Fehler beim Lesen von Datei
-
Hallo zusammen!
Ich möchte gern folgende Datei in mein Programm einlesen:
A a A
A a B
A b A
...
F a B
F b A
F c Aifstream fin(filename); while( !fin.eof() ) { fin >> n.start; fin >> n.x; fin >> n.ziel; nodes.push_back(n); } for(vector<NeaNode>::iterator it = nodes.begin(); it != nodes.end(); it++) cout << it->start << " " << it->x << " " << it->ziel << endl;Dabei wird der letze Eintrag 'F c A' 2-mal ausgegeben, statt nur 1-mal.
Wenn ich mit
while( fin >> n.start >> n.x >> n.ziel ) nodes.push_back(n);einlese, funktioniert alles richtig, und der letzte Eintrag wird nur 1-mal ausgegeben.
Kann mir jemand sagen, wo der Fehler liegt?
Gruß heine789
-
eof() wird erst dann auf true gesetzt, wenn eine Lese-Operation auf's Dateiende gestoßen ist. In deiner Schleife bedeutet das für den letzten Durchlauf:
- fin.eof() ist (noch) false
fin>>n.start;wird ausgeführt und setzt eofbit und failbit- alle weiteren Lese-Oprationen machen nichts mehr
- push_back() bekommt demzufolge das unveränderte Objekt n
Die zweite Variante funktioniert, weil istream::operator>> den Stream zurückgibt - und über die Umwandlung nach void* und bool fragst du ab, ob er noch intakt ist, bevor du push_back() aufrufst.
-
Der letzte Wert wird gelesen, damit ist eof aber nicht erreicht.
Erst beim nächsten Lesezugriff (also über das letzte Element hinaus) wird eof gesetzt.Dadurch das fin dann ungültig ist, werden die anderen Operationen ignoriert , die Werte von n nicht geändert und somit doppelt hinzugefügt.
-
wie schauts mit einer do-while schleife aus statt einer while ?
-
Mr Evil schrieb:
wie schauts mit einer do-while schleife aus statt einer while ?
Dürfte den selben Effekt haben wie die normale while-Schleife. Du mußt schon aus der Mitte der Schleife rausspringen, um an der richtigen Stelle abzubrechen:
while(fin)//fängt zusätzlich zum EOF auch Eingabefehler ab { fin >> n.start; fin >> n.x; fin >> n.ziel; if(!fin) break; nodes.push_back(n); } //oder fin.exceptions(ios::failbit); try { while(fin) { fin >> n.start; fin >> n.x; fin >> n.ziel; nodes.push_back(n); } } catch(ios::failure&e) {} //oder die Alternativlösung von heine ;)
-
Danke für eure Antworten!
Dann werd ich bei der zweiten Variante bleiben.
Gruß heine789
-
CStoll schrieb:
...
... fin.exceptions(ios::failbit); ...

Danke,
Simon2.
-
Simon2 schrieb:

Was guckst du so erstaunt? Noch nie die Exception-Behandlung der IO-Streams in Natura gesehen?
-
CStoll schrieb:
Simon2 schrieb:

Was guckst du so erstaunt? Noch nie die Exception-Behandlung der IO-Streams in Natura gesehen?
Genau !
Gruß,
Simon2.