2010-02-12 25 views
28

¿Cómo verifico el fin de archivo con la función std::getline? Si uso eof(), no señalizaré eof hasta que intente leer más allá del final del archivo.comprobando eof en cadena :: getline

+0

Ese 'No se recomienda eof' es cierto, pero por una razón diferente. Leer pasado EOF es * exactamente * lo que haces cuando quieres probar EOF, entonces 'eof' funciona bien en ese sentido. –

Respuesta

9

Basta con leer a continuación, compruebe que la operación de lectura tuvo éxito:

std::getline(std::cin, str); 
if(!std::cin) 
{ 
    std::cout << "failure\n"; 
} 

Desde el fracaso puede ser debido a una serie de causas, puede utilizar la función eof miembro para ver que lo que ocurrió fue en realidad EOF:

std::getline(std::cin, str); 
if(!std::cin) 
{ 
    if(std::cin.eof()) 
     std::cout << "EOF\n"; 
    else 
     std::cout << "other failure\n"; 
} 

getline devuelve la corriente para que pueda escribir de forma más compacta:

if(!std::getline(std::cin, str)) 
39

El bucle de lectura canónica en C++ es:

while (getline(cin, str)) { 

} 

if (cin.bad()) { 
    // IO error 
} else if (!cin.eof()) { 
    // format error (not possible with getline but possible with operator>>) 
} else { 
    // format error (not possible with getline but possible with operator>>) 
    // or end of file (can't make the difference) 
} 
+1

Esta respuesta es simplemente genial. Si necesita mensajes de error, este es el (único) camino a seguir. Realmente toma su tiempo para resolver esto: http://gehrcke.de/2011/06/reading-files-in-c-using-ifstream-dealing-correctly-with-badbit-failbit-eofbit-and-perror/ –