Maison > développement back-end > C++ > Comment puis-je empêcher la lecture de la dernière ligne deux fois lors de l'utilisation de « fstream » en C ?

Comment puis-je empêcher la lecture de la dernière ligne deux fois lors de l'utilisation de « fstream » en C ?

Linda Hamilton
Libérer: 2024-12-11 02:32:13
original
684 Les gens l'ont consulté

How Can I Prevent Reading the Last Line Twice When Using `fstream` in C  ?

Test du flux fstream : éviter les problèmes de dernière ligne lus deux fois avec good() et eof()

L'utilisation de fstream pour les opérations de saisie de fichiers implique souvent de vérifier l'état du flux pour déterminer quand arrêter la lecture. Cependant, l'utilisation de certains indicateurs d'état peut entraîner des problèmes inattendus, tels que la lecture deux fois de la dernière ligne. Cet article explore la cause sous-jacente et propose des solutions pour éviter ce problème.

Pourquoi la dernière ligne est lue deux fois

Le problème se pose lors de l'utilisation de good() ou ! Conditions eof() dans une boucle while qui utilise getline() pour lire les lignes d'un fichier. Voici pourquoi cela se produit :

  • good() n'est pas équivalent à stream.operator bool() : malgré son nom, good() n'indique pas directement si le flux est en bon état. Au lieu de cela, il teste l'état du flux et le caractère mis en mémoire tampon après l'opération getline(). Si l’un ou l’autre est faux, good() renvoie false. Cela peut conduire à ce que la dernière ligne soit lue deux fois car getline() peut réussir même s'il n'y a plus d'entrée après la dernière ligne.

Correction : Utilisez getline() valeur de retour pour vérifier la lecture réussie de la ligne :

while (getline(stream, line)) {
  // Use line here.
}
Copier après la connexion
  • eof() reflète l'état actuel : eof() vérifie si le flux a atteint la position de fin de fichier (EOF). Cependant, atteindre EOF ne signifie pas nécessairement que la dernière opération getline() a échoué ou n'indique pas la fin du fichier.

Correction : Vérifiez si l'opération getline() est réussi avant de vérifier EOF :

if (getline(stream, line)) {
  // Use line here.
} else if (stream.eof()) {
  // Handle end-of-file condition.
} else {
  // Handle error condition.
}
Copier après la connexion

Bonnes pratiques

Pour éviter ces problèmes et traiter efficacement les lignes de fichiers, tenez compte des points suivants :

  • Utilisez l'option >> opérateur : Surchargé pour les flux, cet opérateur peut vérifier le succès ou l'échec des opérations d'entrée. Par exemple :
if (stream >> foo >> bar) {
  // Use foo and bar here.
} else {
  // Handle error condition.
}
Copier après la connexion
  • Utilisez une boucle for explicite : cela élimine le besoin de vérifications de l'état du flux :
for (string line; getline(stream, line);) {
  // Use line here.
}
Copier après la connexion

En suivant ces directives, vous pouvez éviter de lire deux fois la dernière ligne par inadvertance et garantir un traitement fiable des entrées de fichiers avec fstream.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal