Maison >développement back-end >C++ >Pourquoi ma vérification EOF répète-t-elle la dernière ligne lors de la lecture d'un fichier texte ?

Pourquoi ma vérification EOF répète-t-elle la dernière ligne lors de la lecture d'un fichier texte ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-31 12:18:09785parcourir

Why Does My EOF Check Repeat the Last Line When Reading a Text File?

Bogue en double : EOF répète la dernière ligne dans un fichier texte lu

Le code en question vise à lire des entiers à partir d'un fichier texte ligne par ligne jusqu’à atteindre l’indicateur de fin de fichier (EOF). Cependant, l'itération finale lit de manière inattendue le dernier entier deux fois.

Racine du problème :

Le problème réside dans la nature de la lecture des fichiers. Lorsque le flux d'entrée atteint la marque EOF, le ios::eofbit est augmenté. Ce bit indique que la dernière opération de lecture a rencontré l'EOF, et non que le flux se trouve à la fin du fichier.

Analyse détaillée :

Considérez la séquence d'événements suivante :

  1. Lire l'entier 10.
  2. Lire l'entier 10.
  3. Lire l'entier 20.
  4. Lisez l'entier 30.
Rencontrez l'EOF après avoir lu 30.

Dans la dernière itération, l'entier 30 est toujours la valeur actuelle dans le flux d’entrée. Lorsque l'EOF est rencontré, le ios::eofbit est déclenché, mais la valeur de x reste 30. Le code procède à la sortie de la valeur de x (qui est 30) et vérifie l'EOF dans la condition de boucle. Puisque EOF est maintenant défini, le programme quitte la boucle.

Correction suggérée :

while (true) {
    int x;
    iFile >> x;
    if (iFile.eof()) break;
    cerr << x << endl;
}
Pour résoudre ce bogue, remplacez la condition de boucle par une vérification plus explicite d'EOF :

En vérifiant explicitement EOF après chaque opération de lecture, le code garantit que le dernier entier n'est pas lu et imprimé deux fois.

Bogue supplémentaire :

Le code d'origine manque également de vérification des erreurs. Si le fichier d'entrée est vide, la boucle ne se terminera jamais car l'eofbit ne sera pas augmenté jusqu'à ce que la première opération de lecture rencontre l'EOF. Pour éviter cela, ajoutez une gestion des erreurs appropriée avant de tenter de lire le 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