std::istringstream
-
Folgender Code funktioniert unter MSVC einwandfrei, d.h. via istringstream wird input sauber in Tokens zerlegt. Wenn die Eingabe nicht wie erwartet aussieht (e.g. test), dann werden value und str nicht verändert. Genauso soll es auch sein. Aber ist dieses Verhalten auch so definiert, oder könnte es auch zu einer Exception kommen (anderes SDK, anderer Compiler, etc.)?
#include <iostream> #include <sstream> #include <string> int main() { std::string input; while (std::getline(std::cin, input)) { std::istringstream iss(input); std::string token; iss >> token; if (token == "test") { int value = 0; iss >> value; std::string str; iss >> str; std::cout << value << " " << str << "\n"; } } return 0; }
Danke und Gruß
-
Aber ist dieses Verhalten auch so definiert, oder könnte es auch zu einer Exception kommen (anderes SDK, anderer Compiler, etc.)?
Es kann nur zu einer Exception kommen, wenn du die Exception-Mask entsprechend gesetzt hast.
Das ganze ist schließlich standardisiert, da wird (hoffentlich) jeder Compiler das selbe Ergebnis erbringen.
Bei Skalaren:
Wenn keine Zeichen im Stream vorhanden sind, dann gilt bei C++11 fürnum_get
...N3337 §22.4.2.1.2/1 Stage 3 schrieb:
The numeric value to be stored can be one of:
— zero, if the conversion function fails to convert the entire field. [...]
— the most positive representable value, if the field represents a value too large positive to be represented in val. [...]
— the most negative representable value or zero for an unsigned integer type, if the field represents a value too large negative to be represented in val. [...]
— the converted value, otherwise.
The resultant numeric value is stored in val.Bei Strings wird natürlich nichts verändert, da keine Zeichen im Stream liegen die man extrahieren könnte.
Daher wirdstd::sentry
beigood()
den Rückgabewertfalse
bekommen, der dazu führt, dass der String in keinster Weise verändert wird.