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
Libérer: 2024-12-15 13:28:16
original
244 Les gens l'ont consulté

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.
}
Copier après la connexion

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();
}
Copier après la connexion

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!

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