c++ - sstream - stringstream eof
Configurar el contenido de un std:: stringstream con str(const char*) tiene extrañas consecuencias (2)
El modo de apertura predeterminado para un objeto std::stringstream
está in | out
in | out
El uso de un modo diferente anula estas opciones. Dado que no se puede escribir en la secuencia, el operador de inserción no se puede utilizar para escribir en la secuencia. Es por esto que str()
da la misma salida dos veces.
También debe abrir manualmente la secuencia en el modo de salida:
std::stringstream ssb("Setting string", std::ios_base::out | std::ios_base::ate);
Alternativamente, use un std::ostringstream
, que inicializa el subobjeto std::stringbuf
interno out | mode
out | mode
std::ostringstream("Setting string", std::ios_base::ate);
Utilizo std::stringstream
extensivamente para generar código. Me he encontrado con un comportamiento inquisitivo al configurar el contenido con la función str()
seguido de usar el operator<<
. ¿Puede alguien explicarme este comportamiento? Lo agradecería mucho, gracias.
Ejemplo uno:
std::stringstream ssa;
ssa.str("Setting string");
std::cout << ssa.str() << std::endl;
ssa << " adding to string";
std::cout << ssa.str() << std::endl;
Salida:
Cadena de ajuste
añadiendo a la cadena
Esperado:
Cadena de ajuste
Configuración de la cadena añadiendo a la cadena
Entonces, después de leer un poco la documentación, encontré que debería establecer el modo abierto en ios_base::ate
:
std::stringstream ssb(std::ios_base::ate);
ssb.str("Setting string");
std::cout << ssb.str() << std::endl;
ssb << " adding to string";
std::cout << ssb.str() << std::endl;
Salida:
Cadena de ajuste
Cadena de ajuste
De nuevo (o ahora) esperaría:
Cadena de ajuste
Configuración de la cadena añadiendo a la cadena
¿Por qué obtengo los resultados que soy y cómo obtengo el resultado que quiero? Ei ¿Ser capaz de establecer la string
inicial de una string
de stringstream
y stringstream
a esa string
?
Soy consciente de que solo puedo configurar el contenido en la string("")
vacía string("")
y luego solo usar el <<operator
. Esta es, de hecho, la solución que estoy usando. Simplemente no entiendo el comportamiento observado. Y la solución hace que mi código sea más desordenado.
Olvidaste establecer el modo de bandera: std::ios_base::out
. Esto funcionará:
std::stringstream ssb(std::ios_base::out | std::ios_base::ate);
ssb.str("Setting string");
std::cout << ssb.str() << std::endl;
ssb << " adding to string";
std::cout << ssb.str() << std::endl;
Salida:
Setting string
Setting string adding to string