Frage

Ich habe schon einiges ausprobiert,

std::stringstream m;
m.empty();
m.clear();

beides funktioniert nicht.

War es hilfreich?

Lösung

Für alle Standardbibliothekstypen die Memberfunktion empty() ist eine Abfrage, kein Befehl, d.h.Es bedeutet "Bist du leer?" Nicht "Bitte werfen Sie Ihren Inhalt weg".

Der clear() Die Mitgliedsfunktion wird von geerbt ios und wird verwendet, um den Fehlerstatus des Streams zu löschen, z.B.wenn für einen Dateistream der Fehlerstatus festgelegt ist eofbit (Ende der Datei), dann Aufruf clear() setzt den Fehlerstatus auf zurück goodbit (kein Fehler).

Zum Löschen des Inhalts eines stringstream, mit:

m.str("");

ist korrekt, obwohl Folgendes verwendet wird:

m.str(std::string());

ist technisch effizienter, da Sie den Aufruf vermeiden std::string Konstruktor, der dauert const char*.Heutzutage sollte jedoch jeder Compiler in der Lage sein, in beiden Fällen denselben Code zu generieren – ich würde also einfach das verwenden, was besser lesbar ist.

Andere Tipps

Sie können den Fehlerstatus löschen und den Strignstream in einer Zeile leeren

std::stringstream().swap(m); // swap m with a default constructed stringstream

Dadurch wird m effektiv auf einen standardmäßigen konstruierten Zustand zurückgesetzt

m.str("");

scheint zu funktionieren.

Dies sollte unabhängig vom Compiler der zuverlässigste Weg sein:

m=std::stringstream();

Ich schaue immer nach:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

meine 2 Cent:

Dies schien bei mir in xcode und dev-c++ zu funktionieren. Ich hatte ein Programm in Form eines Menüs, das, wenn es iterativ gemäß der Anforderung eines Benutzers ausgeführt wird, eine Stringstream-Variable füllt, die beim ersten Mal, wenn der Code ausgeführt wird, einwandfrei funktionieren würde ausgeführt, löscht den Stringstream jedoch nicht, wenn der Benutzer das nächste Mal denselben Code ausführt.aber die beiden folgenden Codezeilen haben schließlich jedes Mal die Stringstream-Variable gelöscht, bevor die String-Variable aufgefüllt wurde.(2 Stunden Versuch und Irrtum und Google-Suche), übrigens würde es nicht ausreichen, jede Zeile einzeln zu verwenden.

//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 wie in jedem anderen Ausgabestream einen Flush(), um ihn 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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top