web-dev-qa-db-fra.com

vérification de eof dans la chaîne :: getline

Comment vérifier la fin d'un fichier à l'aide de la fonction std::getline? Si j'utilise eof() cela ne signalera pas eof tant que je n'essaierai pas de lire au-delà de la fin du fichier.

37
assassin

La boucle de lecture canonique en C++ est:

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)
}
51
AProgrammer

Il suffit de lire puis de vérifier que l'opération de lecture a réussi:

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

Étant donné que l'échec peut être dû à un certain nombre de causes, vous pouvez utiliser la fonction membre eof pour voir ce qui s'est passé était réellement EOF:

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

getline renvoie le flux pour que vous puissiez écrire de manière plus compacte:

 if(!std::getline(std::cin, str))
12
Manuel