stringstream parser;
parser << 5;
short top = 0;
parser >> top;
parser.str(""); //HERE I'M RESETTING parser
parser << 6; //DOESN'T PUT 6 INTO parser
short bottom = 0;
parser >> bottom;
Warum funktioniert es nicht?
Wir können nichts tun
stringstream parser;
parser << 5;
short top = 0;
parser >> top;
parser.str(""); //HERE I'M RESETTING parser
parser << 6; //DOESN'T PUT 6 INTO parser
short bottom = 0;
parser >> bottom;
Warum funktioniert es nicht?
CB Bailey
Um einen Stringstream zurückzusetzen, müssen Sie normalerweise die zugrunde liegende Sequenz mit auf einen leeren String zurücksetzen str
und um alle Fail- und Eof-Flags mit zu löschen clear
.
parser.str( std::string() );
parser.clear();
Typischerweise passiert das als erstes >>
erreicht das Ende der Zeichenfolge und setzt das eof-Bit, obwohl es den ersten Kurzschluss erfolgreich analysiert. Operationen auf dem Stream danach schlagen sofort fehl, da das eof-Bit des Streams immer noch gesetzt ist.
Ich persönlich denke parser.str("")
ist klarer, aber das ist Ansichtssache.
– TED
17. Mai 2010 um 10:14 Uhr
Es könnte sich lohnen, diese Antwort zu bearbeiten, um parser.clear() an erster Stelle zu setzen, da andere Methoden zum Hinzufügen von Inhalten zum Stream (z. B. parser << 5) nicht funktionieren, es sei denn, clear wird zuerst aufgerufen.
– John Doucette
20. Februar 2014 um 22:13 Uhr
@TED, ich denke, es ist auf diese Weise etwas effizienter, da Sie es vermeiden, den String-Konstruktor für a aufzurufen const char *
– Moha das allmächtige Kamel
7. September 2015 um 13:05 Uhr
@Mhd.Tahawi – Es gibt einige Fälle, insbesondere solche, die Dinge betreffen, die von Natur aus langsam sind, wie das Ändern der Größe / Zerstörung dynamisch zugewiesener Container, in denen es der Gipfel der Torheit wäre, das weniger Klare für eine theoretische Mikrooptimierung zu tun.
– TED
7. September 2015 um 16:47 Uhr
parser.str({});
– v.oddou
22. Mai 2019 um 5:40 Uhr