Respostas:
Eu usei uma sequência de clear e str no passado:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
O que funcionou para os streams de entrada e de saída. Como alternativa, você pode limpar manualmente e, em seguida, buscar a sequência apropriada para o início:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
Isso evitará algumas realocações feitas str
sobrescrevendo o que quer que esteja no buffer de saída atualmente. Os resultados são assim:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Se você quiser usar a string para funções c, você pode usar std::ends
, colocando um nulo de terminação como este:
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
é uma relíquia do obsoleto std::strstream
, que foi capaz de gravar diretamente em uma matriz char que você alocou na pilha. Você teve que inserir um nulo de terminação manualmente. No entanto, std::ends
não está obsoleto, acho que é porque ainda é útil como nos casos acima.
s.str("");
vez disso. 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 eu reutilizar strings de comprimento diferente, fico com os bits restantes
s.seekp(0); s << std::ends; s.seekp(0);
Parece que a ostr.str("")
ligação resolve.
Se você pretende limpar o buffer de uma forma que fará com que ele seja limpo antes de seu primeiro uso, você precisará adicionar algo ao buffer primeiro com 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á com que o failbit
seja definido se o fluxo estiver vazio. Embora apenas a chamada seekp
deva simplesmente retornar se nenhum stream existir.
Você não. Use dois fluxos com nomes diferentes para maior clareza e deixe o compilador de otimização descobrir que pode reutilizar o antigo.
ostringstream
(com base nos dados lidos) e, em seguida, tem que escrever a string construída em ostringstream
algum lugar de tempos em tempos (por exemplo, após uma certa sequência de caracteres ter sido lida) e começar construir uma nova string.