Probleme mit getline()?
-
HALL0.
ich bin heute auf ein problem gestossen, dass ich mir nicht erklären kann. und zwar lese ich immer noch daten aus einer datei aus. ein beispiel für eine zeile ist folgende:
13 14 8 9
wenn ich diese mit
getline(datei,ZEILE);einlese, steht dann in ZEILE:
13 14 89
aus 8 und 9 wurde also 89. woran liegt das?
DANKE.
STICK.
-
Zeigmal den Code wo du die Datei einliest (den ganzen Code). Sollt nämlich eigentlich keine Probleme dieser Art gegeben.
grüße
-
HALL0.
der code sieht wie folgt aus:
int i,j,ZAHL; stringstream Str; string ZEILE; fstream datei; datei.open(pszFileName,ios::in); while (!datei.eof()) { getline(datei,ZEILE); for (i=0;i<(int)ZEILE.size();i++) { if (ZEILE[i] == '/') break; if (ZEILE[i] == ' ') { if (0 != j) { Str << ZEILE.substr(i-j,j); Str >> ZAHL; Str.clear(); } } else j++; } if (j != 0) { Str << ZEILE[ZEILE.size()-1]; Str >> ZAHL; Str.clear(); } } datei.close();VIELEN DANK!
STICK.
-
Erstens hast du vergessen, j zu initialisieren.
Zweitens kommt mir deine Rechnerei mit den substr() etwas seltsam vor (ich komm da nicht mit, stimmen überhaupt die Start- und Endepositionen?).
Und drittens ist es wohl eleganter, den ganzen Block auf einmal in den Stream zu packen:
while(datei) // besser als 'nur' while(!datei.eof()) - fängt auch Lesefehler ab { getline(datei, zeile); str.str(zeile);//gelesene Zeile in Stringstream schreiben while(str) //das hier bricht ab, wenn es eine Nicht-Zahl (also '/' oder das Zeilenende erreicht hat { str>>zahl; //zahl weiterverarbeiten } str.clear(); }Viertens: Debugging hilft mitunter
(zur Not setz einfach ein cout<<ZEILE<<endl; unter deinen getline())
-
@CStoll:
ich bin gerade dabei, deinen vorschlag abzuarbeiten. leider scheint das nicht zu funktionieren. wenn ich eine zeile habe, die mit einem '//' beginnt, wird bei mir auf dem bildschirm für ZAHL so etwas wie '-865242425' ausgedruckt. ist bei deinem vorschlag vielleicht noch etwas vergessen wurden?while (datei) { getline(datei,ZEILE); cout << ZEILE << endl; _getch(); Str.str(ZEILE); while (Str) { Str >> ZAHL; cout << ZAHL << " "; _getch(); } cout << "\n\n"; Str.clear(); }DANKE.
STICK.
-
Ups, kleiner Fehler von mir - wenn das Lesen fehlgeschlagen ist, steht ja noch irgendwas in der Zielvariablen, also müsstest du vor der Weiterverarbeitung noch prüfen, ob der Stream noch intakt ist:
//altmodische Form: while(str) { str>>zahl; if(!str) break; cout<<zahl; } //kürzer und eleganter while(str>>zahl) //op>> liefert den Stream zurück, dessen Status anschließend von while() überprüft werden kann { cout<<zahl; }
-
DANKE, jetzt klappts. ist WIRKLICH ein GUTES FORUM hier!!!
