Ich habe schon mehrere Dinge ausprobiert,
std::stringstream m;
m.empty();
m.clear();
beide funktionieren nicht.
Ich habe schon mehrere Dinge ausprobiert,
std::stringstream m;
m.empty();
m.clear();
beide funktionieren nicht.
Antworten:
Für alle Standardbibliothekstypen ist die Mitgliedsfunktion empty()
eine Abfrage, kein Befehl, dh sie bedeutet "Sind Sie leer?" nicht "Bitte werfen Sie Ihren Inhalt weg".
Die clear()
Member-Funktion wird von geerbt ios
und zum Löschen des Fehlerstatus des Streams verwendet. Wenn beispielsweise für einen Dateistream der Fehlerstatus auf eofbit
(Dateiende) festgelegt ist, wird durch Aufrufen clear()
der Fehlerstatus auf goodbit
(kein Fehler) zurückgesetzt. .
Zum Löschen des Inhalts von a stringstream
verwenden Sie:
m.str("");
ist richtig, obwohl mit:
m.str(std::string());
ist technisch effizienter, da Sie das Aufrufen des erforderlichen std::string
Konstruktors vermeiden const char*
. Aber heutzutage sollte jeder Compiler in beiden Fällen den gleichen Code generieren können - also würde ich einfach alles verwenden, was besser lesbar ist.
Sie können den Fehlerstatus löschen und den Stringstream in einer Zeile leeren
std::stringstream().swap(m); // swap m with a default constructed stringstream
Dadurch wird m effektiv auf einen standardmäßig erstellten Zustand zurückgesetzt
m.str("");
scheint zu funktionieren.
Dies sollte unabhängig vom Compiler der zuverlässigste Weg sein:
m=std::stringstream();
mm.clear(); mm.str("");
hat es den Trick getan. (kein C ++ 11, sonst wäre Swap besser).
swap
besser als Umzugszuweisung ?
meine 2 Cent:
Dies schien für mich in xcode und dev-c ++ zu funktionieren. Ich hatte ein Programm in Form eines Menüs, das, wenn es gemäß der Anforderung eines Benutzers iterativ ausgeführt wird, eine Stringstream-Variable ausfüllt, die beim ersten Mal in Ordnung ist run, würde aber den Stringstream nicht löschen, wenn der Benutzer das nächste Mal denselben Code ausführt. Die beiden folgenden Codezeilen haben die Stringstream-Variable jedoch jedes Mal gelöscht, bevor die String-Variable aufgefüllt wurde. (2 Stunden Versuch und Irrtum und Google-Suche), übrigens, jede Zeile für sich zu verwenden, würde den Trick nicht tun.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
Es ist ein konzeptionelles Problem.
Stringstream ist ein Stream, daher sind seine Iteratoren vorwärts und können nicht zurückkehren. In einem Ausgabe-Stringstream benötigen Sie ein Flush (), um ihn wie in jedem anderen Ausgabestream neu zu initialisieren.
Diese verwerfen die Daten im Stringstream in gnu c ++ nicht
m.str("");
m.str() = "";
m.str(std::string());
Folgendes leert den Stringstream für mich:
m.str().clear();