Risposte:
Ho usato una sequenza di clear e str in passato:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
Che ha funzionato sia per gli stringstream di input che di output. In alternativa, puoi cancellare manualmente, quindi cercare la sequenza appropriata per iniziare:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
Ciò eviterà alcune riallocazioni eseguite str
sovrascrivendo invece ciò che è attualmente nel buffer di output. I risultati sono così:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Se vuoi usare la stringa per le funzioni c, puoi usare std::ends
, mettendo un null di terminazione come questo:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);
std::ends
è un relitto del deprecato std::strstream
, che era in grado di scrivere direttamente su un array di caratteri allocato nello stack. Dovevi inserire manualmente un null di terminazione. Tuttavia, std::ends
non è deprecato, penso perché è ancora utile come nei casi precedenti.
s.str("");
Invece l' ho fatto . 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>"
e se riutilizzo con stringhe di lunghezza diversa mi rimangono dei bit
s.seekp(0); s << std::ends; s.seekp(0);
Sembra che la ostr.str("")
chiamata faccia il trucco.
Se hai intenzione di svuotare il buffer in un modo che lo farà cancellare prima del primo utilizzo, dovrai prima aggiungere qualcosa al buffer con MSVC.
struct Foo {
std::ostringstream d_str;
Foo() {
d_str << std::ends; // Add this
}
void StrFunc(const char *);
template<class T>
inline void StrIt(const T &value) {
d_str.clear();
d_str.seekp(0); // Or else you'll get an error with this seek
d_str << value << std::ends;
StrFunc(d_str.str().c_str()); // And your string will be empty
}
};
clear
farà causare il failbit
essere impostata se il flusso è vuota. Mentre solo la chiamata seekp
dovrebbe semplicemente tornare se non esiste alcun flusso.
Non lo fai. Usa due flussi con nomi diversi per maggiore chiarezza e lascia che il compilatore di ottimizzazione capisca che può riutilizzare quello vecchio.
ostringstream
(in base ai dati letti) e poi deve scrivere la stringa costruita ostringstream
da qualche parte di volta in volta (ad esempio dopo che è stata letta una certa sequenza di caratteri) e iniziare costruire una nuova stringa.