Respuestas:
He usado una secuencia de clear y str en el pasado:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
Lo que ha hecho lo mismo para los flujos de cadenas de entrada y salida. Alternativamente, puede borrar manualmente y luego buscar la secuencia apropiada para comenzar:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
Eso evitará que se realicen algunas reasignaciones str
al sobrescribir lo que esté en el búfer de salida actualmente. Los resultados son así:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Si desea usar la cadena para funciones c, puede usar std::ends
, poniendo un nulo de terminación 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
es una reliquia de lo obsoleto std::strstream
, que pudo escribir directamente en una matriz de caracteres que asignó en la pila. Debía insertar un nulo de terminación manualmente. Sin embargo, std::ends
no está en desuso, creo que porque sigue siendo útil como en los casos anteriores.
s.str("");
lugar. 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>"
y si reutilizo con cadenas de diferente longitud, me quedan bits
s.seekp(0); s << std::ends; s.seekp(0);
Parece ser que la ostr.str("")
llamada hace el truco.
Si va a borrar el búfer de una manera que hará que se borre antes de su primer uso, primero deberá agregar algo al búfer 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
va causar el failbit
conjunto que ser si la corriente está vacía. Mientras que la llamada seekp
debería simplemente regresar si no existe ninguna transmisión.
Tu no Use dos flujos con nombres diferentes para mayor claridad y deje que el compilador de optimización se dé cuenta de que puede reutilizar el anterior.
ostringstream
(según los datos leídos) y luego tiene que escribir la cadena incorporada en ostringstream
algún lugar de vez en cuando (por ejemplo, después de leer una determinada secuencia de caracteres) y comenzar construyendo una nueva cuerda.