sstream print example español biblioteca c++ file parsing text stringstream

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 utilizando str ("") , por razones de eficiencia podríamos preferir str(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.