Pregunta

He estado tratando de utilizar la clase ++ C stringstream hacer algunas manipulaciones de cadena relativamente simples, pero estoy teniendo un problema con el método get (). Por alguna razón cada vez que extraer los caracteres de salida por el personaje que añade una segunda copia de la letra final.

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(!ss.eof()) {
      ss.get(c);
      cout << "char: " << c << endl;
   }
   return 0;
}

La salida del programa es:

char: h
char: e
char: l
char: l
char: o
char: o

Cualquier ayuda que me puede dar en esto sería apreciada.

¿Fue útil?

Solución

Al final de la ss.eof() corriente no sabe todavía que el final de la secuencia se alcanzará pronto, pero la continuación de la extracción de un personaje falla. Desde la extracción falló porque se ha alcanzado el final de la secuencia, c no se cambia. Su programa no reconoce que ss.get(c) falló y las impresiones que el valor antiguo de c de nuevo.

Una mejor manera de comprobar si todavía hay un personaje que puede ser leído de la corriente sería un bucle como este:

while (ss.get(c)) {
   cout << "char: " << c << endl;
}

Otros consejos

su debido a la orden del bucle. Su lectura de la \ 0 y EOF.

reordenar su código como este

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}

La bandera EOF sólo se establece si se intenta leer más allá del final del archivo. El siguiente código se soluciona el problema mediante pruebas de EOF después de la get () en lugar de antes de que:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(1) {
      ss.get(c);
      if(ss.eof())
          break;

      cout << "char: " << c << endl;
   }
   return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top