2009-02-12 25 views
8

¿Por qué no puedo extraer un valor entero en la variable Num?Número entero de extracto de Stringstream

#include <sstream> 
#include <vector> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    string Digits("1 2 3"); 
    stringstream ss(Digits); 
    string Temp; 
    vector<string>Tokens; 

    while(ss >> Temp) 
     Tokens.push_back(Temp); 

    ss.str(Tokens[0]); 

    int Num = 0; 
    ss >> Num; 
    cout << Num; //output: 0 
} 

Respuesta

10

Cuando la corriente extrae el último de los 3 digist "1 2 3" se establecerá el estado EF. Esto no lo borra el miembro str(), necesita hacerlo usted mismo. Cambie su código a:

ss.clear(); 
ss.str(Tokens[0]); 
+0

Gracias. Tenía una pregunta similar, pero acabo de reconstruir el flujo secundario de nuevo. :( – Muxecoid

+0

Siempre pensé que tenías que llamar a ss.seekg (0, ios :: seek_beg) y restablecer la marca de EOF. ¿De hecho eso no es necesario? Ojalá los documentos de iostreams fueran más precisos ... –

6

tiene que restablecer todos los indicadores de estado (eofbit) y traer la corriente en un buen estado (goodbit):

ss.clear(); // clear status flags 
ss.str(Tokens[0]); 

La razón es que si se mantiene la extracción hasta el final, se quiere toca el final, y el indicador de eof se establecerá en esa secuencia. Después de eso, las operaciones de lectura se cancelarán y tendrá que borrar esa bandera nuevamente. De todos modos, después de borrar y restablecer la cadena, puede seguir extrayendo los enteros.

8

¿Por qué está leyendo en una variable de temperatura string?

Usted sólo puede leer desde el stringstream en un int ...

int main() 
{ 
    string Digits("1 2 3"); 
    stringstream ss(Digits); 
    int Temp; 
    vector<int> Tokens; 

    while(ss >> Temp) 
     Tokens.push_back(Temp); 
} 
2

STL! : P

stringstream ss("1 2 3"); 
vector<int> Tokens; 
copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(Tokens));