Maison >développement back-end >C++ >Comment tester correctement la fin d'un fichier lors de la lecture d'un flux de fichiers en C ?

Comment tester correctement la fin d'un fichier lors de la lecture d'un flux de fichiers en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-21 15:33:10687parcourir

How to Correctly Test for End-of-File When Reading from a File Stream in C  ?

Test de l'état d'entrée du flux par rapport au succès futur

Lors de la lecture des entrées à l'aide de flux, il est essentiel de comprendre la différence entre tester l'état du flux et prédire la réussite des opérations futures.

Problème : Lecture de la Dernière Ligne Deux fois

ifstream f("x.txt");
string line;
while (f.good()) {
  getline(f, line);
  // Use line here.
}

Dans ce code, la dernière ligne est lue deux fois car f.good() teste l'état actuel du flux, et non si getline() réussira. Une fois que getline() atteint l'EOF, f reste dans un "bon" état, donc la boucle continue même après la lecture de la dernière ligne.

Solution : tester le flux après l'opération

Au lieu de cela, vérifiez l'état du flux après avoir effectué l'opération de saisie :

ifstream f("x.txt");
string line;
while (getline(f, line)) {
  // Use line here.
}

Utilisation alternative eof()

Bien qu'il ne soit pas recommandé d'utiliser eof() dans des conditions de boucle, voici une solution équivalente utilisant !f.eof() :

ifstream f("x.txt");
string line;
while (!f.eof()) {
  if (getline(f, line)) {
    // Use line here.
  } else {
    break;
  }
}

Range -Boucle basée sur toutes les lignes

Pour lire et traiter toutes les lignes, utilisez une boucle basée sur une plage loop :

ifstream f("x.txt");
for (std::string line; getline(f, line);) {
  process(line);
}

Good vs Stream State

Notez que f.good() est mal nommé. Cela n'indique pas vraiment la « bonté » du flux, mais renvoie plutôt vrai lorsque le flux n'est pas dans un état « d'échec » ou de « mauvais ». Testez toujours le flux lui-même (c'est-à-dire vérifiez son état d'échec inversé) après avoir effectué des opérations d'entrée pour garantir le succès.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn