Komisches Verhalten von sstream
-
Hallo!
Ich versuche einen Stream auszuwerten, und habe seltsame Probleme mit integers.
stream.good() sollte ja 1 zurückgeben, wenn ich nichts böses mit dem Stream angestellt hab.#include <iostream> #include <string> #include <sstream> using namespace std; int main() { //------ Erster Stream -------- string inputx( "123 A" ); istringstream inputStringx( inputx ); int integerx=0; char characterx='0'; cout << "vor dem auslesen, GOOD? "<< inputStringx.good() << endl; inputStringx >> integerx; cout << integerx << endl; cout << "nach dem ersten element, GOOD? "<< inputStringx.good() << endl; inputStringx >> characterx; cout << characterx << endl; cout << "nach dem 2. element, GOOD? "<< inputStringx.good() << endl; cout << endl; //------ Zweiter Stream -------- string inputy( "A 123" ); istringstream inputStringy( inputy ); int integery=0; char charactery='0'; cout << "vor dem auslesen, GOOD? "<< inputStringy.good() << endl; inputStringy >> charactery; cout << charactery<< endl; cout << "nach dem ersten element, GOOD? "<< inputStringy.good() << endl; inputStringy>> integery; cout << integery<< endl; cout << "nach dem 2. element, GOOD? "<< inputStringy.good() << endl; cout << endl; }Gibt aus:
vor dem auslesen, GOOD? 1 123 nach dem ersten element, GOOD? 1 A nach dem 2. element, GOOD? 1 vor dem auslesen, GOOD? 1 A nach dem ersten element, GOOD? 1 123 nach dem 2. element, GOOD? [b]0[/b]Wiesoooooo?

Ich bräuchte die Funktion zur Kontrolle ob die Konvertierung string zu int funktioniert hat!
-
Hi, na rate mal wieso der Stream am Ende nicht mehr good ist

-
guck dir auch mal bad() und eof() an. http://www.cppreference.com/cppio/good.html
-
Wenn ich den ersten Stream nach dem zweiten lese, ist GOOD am Ende immernoch 1 und EOF ist 0.
Dabei ist der Stream doch schon komplett ausgelesen!
-
Ein Stream wird auch erst EOF wenn Du über das Ende hinausliest. Im ersten Fall liest Du eine Zahl (der Stream wird bis zum ersten Space gelesen) und danach ein Char (es wird genau ein Zeichen gelesen). Damit ist der Stream zwar am Ende, aber exakt. Es wurde noch nicht darüber hinaus gelesen, EOF ist damit falsch.
Aus dem zweiten Stream wird jedoch zuletzt eine Zahl gelesen, also Ziffern, bis keine Ziffer mehr kommt. Da die Implementierung aber nicht weiss, dass die Zahl bei '3' zuende ist, versucht sie eine vierte Ziffer zu lesen. Damit wurde über das Ende hinausgelesen und EOF ist wahr.
-
Ah, danke!
