Maison >développement back-end >C++ >Comment puis-je éviter la double lecture des lignes lors de l'utilisation de flux d'entrée de fichiers C ?

Comment puis-je éviter la double lecture des lignes lors de l'utilisation de flux d'entrée de fichiers C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-15 13:28:16231parcourir

How Can I Avoid Double-Reading Lines When Using C   File Input Streams?

Test de l'état du flux pour l'entrée de fichier : éviter les doubles lectures

Lors de la lecture des données d'un fichier, il est essentiel d'éviter de lire plusieurs fois la même ligne. fois. Cependant, vérifier les états du flux comme good() ou !eof() avant la lecture peut entraîner un comportement inattendu.

Considérez le code suivant :

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

Ce code est destiné à lire toutes les lignes du fichier jusqu'à la fin. Cependant, il lit deux fois la dernière ligne. Pour comprendre pourquoi, nous devons approfondir les éléments internes des drapeaux d'état de flux.

Drapeaux d'état de flux

good(), eof(), fail() et bad() sont des indicateurs d'état de flux qui indiquent l'état actuel d'un flux d'entrée. L'indicateur good() est généralement censé indiquer si le flux est dans un état valide pour une lecture ultérieure, mais ce n'est pas strictement exact. Il est plus précisément décrit comme l'absence d'erreurs ou de conditions de fin de fichier.

Le problème avec good() et !eof()

Lorsque vous vérifiez le flux .good() ou !stream.eof() avant la lecture, vous ne demandez pas au flux si la prochaine opération de lecture réussira. Vous interrogez uniquement l'état actuel.

Par exemple, lorsque la dernière ligne est lue à partir d'un fichier, l'indicateur eof() est défini. Cependant, l'indicateur good() peut toujours être vrai, indiquant qu'aucune erreur ne s'est produite lors de la dernière lecture.

Solution

Pour éviter les doubles lectures, la bonne approche consiste à testez le flux après l'opération de lecture :

// Read all lines from a file
for (std::string line; getline(f, line);) {
  process(line);
}

// Read an integer and store it in foo
int foo;
if (f >> foo) {
  use(foo);
} else {
  handle_error();
}

Cette approche garantit que vous traitez uniquement les données qui ont été lues avec succès à partir du fichier.

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