Pregunta

Ya he probado varias cosas

std::stringstream m;
m.empty();
m.clear();

Ambos no funcionan.

¿Fue útil?

Solución

Para todos los tipos de biblioteca estándar, la función miembro empty() es una consulta, no un comando, es decirSignifica "¿Estás vacío?" no "por favor tire su contenido".

El clear() La función miembro se hereda de ios y se utiliza para borrar el estado de error de la transmisión, p.si una secuencia de archivos tiene el estado de error establecido en eofbit (fin de archivo), luego llamando clear() restablecerá el estado de error a goodbit (No hay error).

Para borrar el contenido de un stringstream, usando:

m.str("");

es correcto, aunque usando:

m.str(std::string());

es técnicamente más eficiente, porque evitas invocar el std::string constructor que toma const char*.Pero cualquier compilador hoy en día debería poder generar el mismo código en ambos casos, por lo que elegiría lo que sea más legible.

Otros consejos

Puede borrar el estado de error y vaciar el stringstream, todo en una línea

std::stringstream().swap(m); // swap m with a default constructed stringstream

Esto efectivamente restablece m a un estado construido predeterminado

m.str("");

parece funcionar.

Esta debería ser la forma más confiable independientemente del compilador:

m=std::stringstream();

Siempre lo estoy analizando:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

mis 2 centavos:

esto pareció funcionar para mí en xcode y dev-c++, tenía un programa en forma de menú que, si se ejecuta de forma iterativa según la solicitud de un usuario, llenará una variable de flujo de cadena que funcionaría bien la primera vez que el código ejecutar pero no borrará el flujo de cadenas la próxima vez que el usuario ejecute el mismo código.pero las dos líneas de código siguientes finalmente borraron la variable stringstream 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í sola 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 una secuencia, por lo que sus iteradores van hacia adelante y no pueden regresar.En un flujo de cadena de salida, necesita una descarga() para reinicializarlo, como en cualquier otro flujo de salida.

Estos no descartan los datos en el stringstream en gnu c++

    m.str("");
    m.str() = "";
    m.str(std::string());

Lo siguiente vacía el flujo de cadenas para mí:

    m.str().clear();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top