Me gustaría borrar y reutilizar un ostringstream (y el buffer subyacente) para que mi aplicación no tenga que hacer tantas asignaciones. ¿Cómo reinicio el objeto a su estado inicial?¿Cómo reutilizar un ostringstream?
Respuesta
He usado una secuencia de claro y str en el pasado:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
¿Qué ha hecho lo tanto stringstreams de entrada y salida. Alternativamente, se puede borrar manualmente, a continuación, busque la secuencia apropiada al comenzar:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
que evitará que algunas reasignaciones realizadas por str
sobreescribiendo lo que está en el búfer de salida actualmente en su lugar. Los resultados son como sigue:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Si desea utilizar la cadena de c-funciones, puede utilizar std::ends
, poniendo un cero terminador de esta manera:
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 un relicto de la obsoleta std::strstream
, que fue capaz de escribir directamente en una matriz de caracteres que asignó en la pila. Debes 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.
Estoy tratando de usar s.str() con un ostream. El tamaño lo está arruinando (puedo ver que el primer carácter es nulo pero imprime mucho más). ¿Hay una buena manera de arreglar la longitud de str? estoy usando s.str(). c_str(); ATM y funciona muy bien –
En realidad, incluso esto no es correcto. Acabo de hacer 's.str (" ");' en su lugar. 'auto str = s.str(); auto cstr = str.c_str(); archivo << cstr; s.clear(); s.buscar (0); s << ends; ' –
std :: ends no funciona en google test ' boost :: any a = 1; std :: buffer de ostringstream; buffer << a << std :: ends; EXPECT_EQ (buffer.str(), "cualquier <(int)1>"); '' TestUtilsTest.cpp: 27: Si no esperado: buffer.str() que es: "cualquier <(int)1> \ 0" que es igual a: "any <(int)1>" ' y si reutilizo con diferentes cadenas de longitud, me quedan los bits –
Parece ser que la llamada ostr.str("")
hace el truco.
Vale la pena señalar que esto no reutilizará el buffer subyacente del ostringstream - simplemente asigna un nuevo buffer. Entonces, mientras reutiliza el objeto ostringstream, todavía está asignando dos almacenamientos intermedios. No creo que ostringstream esté diseñado para su reutilización de la manera que usted pretende. – razlebe
Tampoco borra el estado, que es lo que .clear() hace. Estoy de acuerdo, realmente no debe ser usado así. Solo crea uno nuevo para estar seguro. Solo si su perfil descubrirá si hace alguna diferencia. –
sgreeve, Brian, eso es correcto. Tenga en cuenta, sin embargo, cómo el método anterior del litb requiere el uso de std :: ends. Reutiliza el búfer, pero te hace codificar de manera diferente con cadenas de caracteres (normalmente no usas std :: ends). –
No es así. Utilice dos secuencias con nombres diferentes para mayor claridad y deje que el compilador optimizador descubra que puede reutilizar el anterior.
... y, por supuesto, espero que sí, averígualo que sí. –
considere el caso de uso donde el código se repite sobre datos de entrada, escribiendo en un 'ostringstream' (basado en la lectura de datos) y luego tiene que escribir la cadena construida en el' ostringstream' en algún lugar de vez en cuando (por ejemplo, después de un cierto secuencia de caracteres fue leída) y comienza a construir una nueva cadena. –
Si va a borrar el búfer de forma que lo borre antes de usarlo por primera vez, deberá agregar algo al búfer primero 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
}
};
No veo el comportamiento defectuoso en VS2012. Además, al llamar a ['clear'] (http://www.cplusplus.com/reference/ios/ios/clear/) se establecerá el' failbit' si la transmisión está vacía. Si solo llama a ['seekp'] (http://www.cplusplus.com/reference/ostream/ostream/seekp/), simplemente debe devolver si no existe una transmisión. –
- 1. Cómo borrar ostringstream
- 2. ¿Cómo se borra una instancia std :: ostringstream para que se pueda reutilizar?
- 3. ¿Cómo uso ostringstream correctamente en C++?
- 4. Redondeo de flotadores con ostringstream
- 5. C++ formato macro/inline ostringstream
- 6. ¿Cómo puedo reutilizar un bloque varias veces?
- 7. ¿Cómo reutilizar un objeto Criteria con hibernación?
- 8. ¿Cómo reutilizar un hilo en Java?
- 9. ¿Cómo personalizar y reutilizar un estilo DataGridColumnHeader?
- 10. Cómo reutilizar StringBuilder obj?
- 11. Cómo reutilizar FtpWebRequest Connection
- 12. ¿Por qué la tira ostringstream NULL?
- 13. std :: ostringstream no devuelve una cadena válida
- 14. Cómo reutilizar diseños en WPF
- 15. Jsch Cómo reutilizar una sesión
- 16. Cómo reutilizar fragmentos Spring XML
- 17. ¿Cómo reutilizar una clase en sass sin usar un mixin?
- 18. ¿Cómo puedo reutilizar un color en una hoja de estilo?
- 19. ¿Cómo reutilizar iconos (xaml-paths) en un proyecto grande?
- 20. Cómo reutilizar un ensamblado .Net desde una aplicación C pura
- 21. ¿Cómo se puede reutilizar un threadpool después del cierre
- 22. reutilizar un bloque de código en YAML
- 23. ¿Cómo reutilizar el socket en .NET?
- 24. ¿Cómo puedo reutilizar este botón de Android?
- 25. ¿Cómo reutilizar las proyecciones en Entity Framework?
- 26. Cómo reutilizar una instancia de hashlib.md5
- 27. Cómo reutilizar el código con VBA
- 28. Cómo reutilizar WPF DataGridTemplateColumn (incluida la vinculación)
- 29. Reutilizar una vista ClearCase
- 30. Reutilizar Pasos de pepino
posible duplicado del [En C++, ¿cómo se borra una variable stringstream?] (Http://stackoverflow.com/questions/20731/in-c-how-do-you-clear-a-stringstream -variable) – mpromonet