Ich möchte einen Ostringstream (und den zugrunde liegenden Puffer) löschen und wiederverwenden, damit meine App nicht so viele Zuordnungen vornehmen muss. Wie setze ich das Objekt in den Ausgangszustand zurück?
c++
stl
reset
ostringstream
twk
quelle
quelle
Antworten:
Ich habe in der Vergangenheit eine Folge von clear und str verwendet:
Was sowohl für Input- als auch für Output-Stringstreams funktioniert hat. Alternativ können Sie manuell löschen und dann zu Beginn die entsprechende Reihenfolge suchen:
Dies verhindert einige Neuzuweisungen, indem
str
stattdessen alles überschrieben wird, was sich derzeit im Ausgabepuffer befindet. Die Ergebnisse sind wie folgt:Wenn Sie die Zeichenfolge für c-Funktionen verwenden möchten, können Sie
std::ends
eine abschließende Null wie folgt setzen:std::ends
ist ein Relikt des Veraltetenstd::strstream
, das direkt in ein Char-Array schreiben konnte, das Sie auf dem Stapel zugewiesen haben. Sie mussten manuell eine abschließende Null einfügen. Allerdingsstd::ends
ist nicht veraltet, denke ich, weil es immer noch nützlich ist, wie in den oben genannten Fällen.quelle
s.str("");
stattdessen einfach getan .auto str = s.str(); auto cstr = str.c_str(); file << cstr; s.clear(); s.seekp(0); s << ends;
boost::any a = 1; std::ostringstream buffer; buffer << a << std::ends; EXPECT_EQ( buffer.str(), "any<(int)1>" );
TestUtilsTest.cpp:27: Failure Expected: buffer.str() Which is: "any<(int)1>\0" To be equal to: "any<(int)1>"
und wenn ich mit Strings unterschiedlicher Länge wiederverwenden, bleiben mir Bits übrigs.seekp(0); s << std::ends; s.seekp(0);
Scheint, dass der
ostr.str("")
Anruf den Trick macht.quelle
Wenn Sie den Puffer so löschen möchten, dass er vor seiner ersten Verwendung gelöscht wird, müssen Sie dem Puffer zuerst mit MSVC etwas hinzufügen.
quelle
clear
wird dazu führen , diefailbit
gesetzt werden , wenn der Strom ist leer. Während nur anrufenseekp
sollte einfach zurückkehren, wenn kein Stream existiert.Das tust du nicht. Verwenden Sie aus Gründen der Übersichtlichkeit zwei Streams mit unterschiedlichen Namen und lassen Sie den optimierenden Compiler herausfinden, dass er den alten wiederverwenden kann.
quelle
ostringstream
(basierend auf den gelesenen Daten) schreibt und dannostringstream
von Zeit zu Zeit (z. B. nachdem eine bestimmte Zeichenfolge gelesen wurde) die eingebaute Zeichenfolge irgendwo schreibt und startet Erstellen einer neuen Zeichenfolge.