Ya he probado varias cosas,
std::stringstream m;
m.empty();
m.clear();
los cuales no funcionan.
Ya he probado varias cosas,
std::stringstream m;
m.empty();
m.clear();
los cuales no funcionan.
Respuestas:
Para todos los tipos de biblioteca estándar, la función miembro empty()
es una consulta, no un comando, es decir, "¿estás vacío?" no "por favor, deseche sus contenidos".
La clear()
función miembro se hereda ios
y se utiliza para borrar el estado de error de la secuencia, por ejemplo, si una secuencia de archivo tiene el estado de error establecido en eofbit
(fin de archivo), la llamada clear()
volverá a establecer el estado de error en goodbit
(sin error) .
Para borrar el contenido de a stringstream
, use:
m.str("");
es correcto, aunque usando:
m.str(std::string());
es técnicamente más eficiente, porque evita invocar al std::string
constructor que toma const char*
. Pero cualquier compilador en estos días debería ser capaz de generar el mismo código en ambos casos, por lo que simplemente elegiría lo que sea más legible.
Puede borrar el estado de error y vaciar el flujo de cadena todo en una línea
std::stringstream().swap(m); // swap m with a default constructed stringstream
Esto restablece efectivamente m a un estado construido por defecto
m.str("");
parece funcionar.
Esta debería ser la forma más confiable, independientemente del compilador:
m=std::stringstream();
mm.clear(); mm.str("");
hice el truco. (sin C ++ 11, de lo contrario, el intercambio sería mejor).
swap
mejor que la asignación de movimiento?
mis 2 centavos:
esto parecía funcionar para mí en xcode y dev-c ++, tenía un programa en forma de menú que, si se ejecutaba iterativamente según la solicitud de un usuario, llenaría una variable de secuencia de cadena que funcionaría bien la primera vez que el código ejecutar pero no borraría el flujo de cadena la próxima vez que el usuario ejecute el mismo código. pero las dos líneas de código a continuación finalmente borraron la variable de secuencia de cadena cada vez antes de llenar la variable de cadena. (2 horas de prueba y error y búsquedas en google), por cierto, usar cada línea por sí solo no funcionaría.
//clear the stringstream variable
sstm.str("");
sstm.clear();
//fill up the streamstream variable
sstm << "crap" << "morecrap";
Es un problema conceptual.
Stringstream es un flujo, por lo que sus iteradores son hacia adelante, no pueden regresar. En un flujo de cadena de salida, necesita un flush () para reinicializarlo, como en cualquier otro flujo de salida.
Estos no descartan los datos en el flujo de cadena en gnu c ++
m.str("");
m.str() = "";
m.str(std::string());
Lo siguiente sí vacía el flujo de cadena para mí:
m.str().clear();