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 ?
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 :
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!