c++ - print - cómo reutilizar stringstream
stringstream c++ example (6)
Depende de lo que estés haciendo con él. En general, es más fácil crear un nuevo istringstream
o ostringstream
. Para "restablecer" un flujo, debe borrar su búfer, borrar todos los indicadores de error, restablecer los indicadores de formato, más la precisión y el relleno, imbue
con el entorno local original y no olvidar ninguna información de formato extendida generada con un valor devuelto desde xalloc
. En suma, imposible de conseguir correcto.
Y mientras estoy en eso, su bucle es incorrecto y probablemente dará como resultado que la última línea se procese dos veces. file.eof()
solo tiene un significado utilizable después de que la entrada haya fallado (y aún así, no es 100% confiable). Lo que quieres es:
std::string line;
while ( std::getline( file, line ) ) {
if ( !line.empty() ) {
std::istringstream buffer( line );
// ...
}
}
(En realidad, es probable que desee recortar el espacio en blanco final de la línea antes de la prueba para que esté vacío).
Estos hilos NO me responden:
restableciendo un stringstream
¿Cómo se borra una variable stringstream?
std::ifstream file( szFIleName_p );
if( !file ) return false;
// create a string stream for parsing
std::stringstream szBuffer;
std::string szLine; // current line
std::string szKeyWord; // first word on the line identifying what data it contains
while( !file.eof()){
// read line by line
std::getline(file, szLine);
// ignore empty lines
if(szLine == "") continue;
szBuffer.str("");
szBuffer.str(szLine);
szBuffer>>szKeyWord;
szKeyword
siempre contendrá la primera palabra, szBuffer
no se está restableciendo, no se puede encontrar un ejemplo claro en ninguna parte sobre cómo usar stringstream.
Nuevo código después de la respuesta:
...
szBuffer.str(szLine);
szBuffer.clear();
szBuffer>>szKeyWord;
...
Ok, esa es mi versión final:
std::string szLine; // current line
std::string szKeyWord; // first word on the line identifying what data it contains
// read line by line
while( std::getline(file, szLine) ){
// ignore empty lines
if(szLine == "") continue;
// create a string stream for parsing
std::istringstream szBuffer(szLine);
szBuffer>>szKeyWord;
En la mayoría de los casos, es más fácil crear un nuevo istringstream
o ostringstream
lugar de restablecer los mismos.
Sin embargo, si quieres reenviarlos:
Vuelva a enviar las banderas de la transmisión (para evitar comportamientos inesperados) utilizando
clear ()
.Si bien puede corregir el contenido de su
stringstream
utilizandostr ("")
, por razones de eficiencia podríamos preferirstr(std::string())
.
Imagina un archivo de configuración.
par1=11
par2=22
códigos:
std::string line, strpar1, strpar2;
int par1, par2;
std::ifstream configfile("config.cfg");
std::getline(configfile, line); // first line to variable "line"
std::istringstream sline(line);
while (std::getline(sline, strpar1, ''=''));
par1 = std::stoi(strpar1); // par1 get 11
bool b = sline.eof(); // true
std::getline(configfile, line); // second line to variable "line"
sline.clear(); //
sline.str(line); // reuse "sline"
b = sline.good(); // true // goodbit is zero, indicating that none of the other bits is set.
b = sine.fail(); // false
b = sline.bad(); // false
b = sline.eof(); // false
while (std::getline(sline, strpar2, ''=''));
par2 = std::stoi(strpar2); // par2 get 22
Goodbit es cero, lo que indica que ninguno de los otros bits está establecido
No clear()
la transmisión después de llamar a str("")
. Eche un vistazo a esta respuesta , también explica por qué debe restablecer el uso de str(std::string())
. Y en su caso, también podría restablecer los contenidos utilizando solo str(szLine)
.
Si no llama a clear()
, las banderas del flujo (como eof
) no se restablecerán, lo que eof
como resultado un comportamiento sorprendente;)
Si tiene la transmisión en un miembro de la clase, use unique_ptr<stringstream>
, luego simplemente reset(new stringstream(...))
para reutilizarla.
ss es stringstream. Utilizar
- primer paso: ss.clear ();
- segundo paso: ss.str ("");
para reutilizar la cadena de caracteres - borra completamente la cadena de cadenas.