Non `while (! My_ifstream.eof ()) {getline (my_ifstream, line)}` en C ++?

Sur ce site , quelqu’un écrit:

while (! myfile.eof() ) { getline (myfile,line); cout << line << endl; } 

Ceci est faux, lisez attentivement la documentation de la fonction membre eof (). Le code correct est le suivant:

 while( getline( myfile, line)) cout << line << endl; 

Pourquoi est-ce?

Il y a deux raisons principales. @Etienne en a souligné un: la lecture pourrait échouer pour une raison autre que celle d’atteindre la fin du fichier. Dans ce cas, votre première version entrera dans une boucle infinie.

Même sans autre échec, le premier ne fonctionnera pas correctement. eof() ne sera défini qu’après la tentative de lecture car la fin du fichier a été atteinte. Cela signifie que la première boucle exécutera une itération supplémentaire que vous ne voulez pas vraiment. Dans ce cas, il ne restra plus qu’à append une ligne vierge supplémentaire à la fin du fichier. Selon ce sur quoi vous travaillez, cela peut avoir une importance ou non. Selon ce que vous utilisez pour lire les données, il est également assez courant de voir la dernière ligne répétée dans la sortie.

Une opération de stream (telle que la lecture) peut échouer pour plusieurs raisons. eof() n’en teste qu’un seul. Pour tous les tester, utilisez simplement l’opérateur de conversion void * du stream. C’est ce qui est fait dans le deuxième extrait.