stringstream gibt Muell aus
-
Hi,
ich habe ein Phaenomen bei istringstream was ich nicht ganz verstehe, naemlich warum stringstream keine doubles schreiben kann und warum es den aktualisierten Wert nicht ausgibt. Hier der Beispielcode:#include <sstream> #include <iostream> int main() { std::stringstream ss; float fvar; double dvar; ss.str( "1.2345" ); std::cout << ss.str() << std::endl; ss >> fvar; ss >> dvar; std::cout << fvar << std::endl << dvar << std::endl; ss.str( "6.7890" ); std::cout << ss.str() << std::endl; ss >> fvar; ss >> dvar; std::cout << fvar << std::endl << dvar << std::endl; return 0; }Ausgabe:
1.2345 1.2345 2.07466e-317 6.7890 1.2345 2.07466e-317Warum ist double immer 2.07466e-317 (ist der kleinste positive Wert den double annehmen kann in etwa)?
Warum wird der float beim 2. Auslesen nicht geaendert?
Immerhin entspricht mein Code dem Beispiel aus der FAQ.
-
Weil dein Stream nach dem ersten Einlesen (mit dem Float) leer ist?
Edit: Desweiteren fehlt vor dem zweiten ss.str(...) ein ss.clear().
-
ok, stimmt

Das erklaert aber nicht das problem warum nach dem erneuten Fuellen des Streams die Ausgabe falsch ist (Stream ist 6.7890, float 1.2345 nach ss >> fvar)
-
wieso ein clear? ss.str("...") setzt doch nen neuen Wert? Und der Stream hat ja den korrekten Wert drin, gibt ihn aber nicht aus
-
atwork schrieb:
wieso ein clear? ss.str("...") setzt doch nen neuen Wert? Und der Stream hat ja den korrekten Wert drin, gibt ihn aber nicht aus
Beim zweiten Lesen konnte aus dem leeren Stream kein gültiger Double ausgelesen werden, deshalb ist ein Fehlerstatus gesetzt. Dieser Fehlerstatus wird mit clear gelöscht.
-
wieso ein clear? ss.str("...") setzt doch nen neuen Wert? Und der Stream hat ja den korrekten Wert drin, gibt ihn aber nicht aus
-
Weil nur der Inhalt des Streams mit str(...) geändert wird, nicht dessen Status (eof). Daher wird danach davon ausgegangen das nichts mehr kommt. Ist zwar etwas umständlich, gehört aber wohl so.
-
sorry fuer den Doppelpost.
Ok, das war die fehlende Information, dass ich mit clear die errorflag zuruecksetzen muss. Setzt ss.str("") eigentlich auch den stream position pointer zurueck? Weil die Ausgabe von ss.str() nachdem ich die Floatvariable gefuellt habe ist noch immer 1.2345, allerdings muss der Streampointer jetzt ja dahinter sitzen weil der double nicht gefuellt werden kann.
Weilss.str("1.2345"); ss >> dval; ss.str("6.7890"); ss >> dval;gibt noch immer 1.2345 nach dem 2. schreiben aus, sprich es gab einen Fehler.
-
Also str(...) ändert einfach nur den Inhalt des Streams, die Flags bleiben bestehen. In deinem Beispiel steht dann zwar der zweite String im Stream, beim zweiten Auslesen hat der Stream aber noch die Flags vom vorherigen Einlesen gesetzt (trotz str(...)). In diesem Fall eof, sprich er glaubt beim Stream am Ende zu sein und daher scheitert das zweite Einlesen (fvar bleibt unverändert). Ob das nun fehlgeschlagen ist, kannst du mit ss.fail() feststellen und bevor du den Stream weiter verwendest, musst du dieses Flag wieder entfernen (zB mit clear()).
-
super, danke, wieder was gelernt.
Habs auch schon entsprechend angepasst. Einen Stream also wieder in den Ursprungszustand zu versetzen muss man
ss.str(""); ss.clear()ausfuehren