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
Linda Hamiltonoriginal
2024-12-11 02:32:13683parcourir

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.
}
  • 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.
}

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.
}
  • 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.
}

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!

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