2009-01-25 11 views
8

¿Cómo puedo detectar y pasar a la siguiente línea usando std :: ifstream?ifstream, fin de línea y pasar a la siguiente línea?

void readData(ifstream& in) 
{ 
    string sz; 
    getline(in, sz); 
    cout << sz <<endl; 
    int v; 
    for(int i=0; in.good(); i++) 
    { 
     in >> v; 
     if (in.good()) 
      cout << v << " "; 
    } 
    in.seekg(0, ios::beg); 
    sz.clear(); 
    getline(in, sz); 
    cout << sz <<endl; //no longer reads 
} 

Sé bueno me diría si ha ocurrido un error pero la transmisión ya no funciona una vez que eso sucede. ¿Cómo puedo verificar si estoy al final de la línea antes de leer otra int?

Respuesta

3

Debe borrar el estado de error de la secuencia con in.clear(); después del bucle, y luego la transmisión funcionará nuevamente como si no hubiera ocurrido ningún error.

También puede simplificar su bucle para:

rendimientos de extracción
while (in >> v) { 
    cout << v << " "; 
} 
in.clear(); 

La corriente si la operación tuvo éxito, por lo que puede probar esto directamente sin comprobar de forma explícita in.good();.

+0

Es posible que un int válido sea seguido inmediatamente por el final del archivo. Para considerar el análisis como un éxito, debe marcar in.fail() como falso, ya que in.good() devolverá falso si se llega al final del archivo incluso si la operación de extracción fue exitosa. –

+0

¡Interesante Charles! –

+0

@Charles: el 'operator void *' implícito llama 'fail', por lo que' while (en >> v) 'tendrá éxito si la extracción tiene éxito, independientemente de si el estado es EOF. – dalle

16

Uso ignorar() para ignorar todo hasta la siguiente línea:

in.ignore(std::numeric_limits<std::streamsize>::max(), '\n') 

Si debe hacerlo de forma manual sólo echa un carácter othe para ver si es '\ n'

char next; 
while(in.get(next)) 
{ 
    if (next == '\n') // If the file has been opened in 
    { break;  // text mode then it will correctly decode the 
    }     // platform specific EOL marker into '\n' 
} 
// This is reached on a newline or EOF 

Este es probablemente fallando porque estás haciendo una búsqueda antes de borrar los bits malos.

in.seekg(0, ios::beg); // If bad bits. Is this not ignored ? 
          // So this is not moving the file position. 
sz.clear(); 
getline(in, sz); 
cout << sz <<endl; //no longer reads 
Cuestiones relacionadas