Maison > développement back-end > C++ > Comment puis-je éviter de lire deux fois la dernière ligne lors de l'utilisation de ifstream en C ?

Comment puis-je éviter de lire deux fois la dernière ligne lors de l'utilisation de ifstream en C ?

Barbara Streisand
Libérer: 2024-12-13 22:31:11
original
835 Les gens l'ont consulté

How Can I Avoid Double-Reading the Last Line When Using ifstream in C  ?

Gestion de l'état du flux : éviter la double lecture de la dernière ligne

Lors de la lecture d'un fichier à l'aide d'ifstream, il est essentiel de gérer correctement l'état du flux pour éviter un comportement inattendu, comme lire deux fois la dernière ligne.

Pourquoi la double lecture Se produit

L'utilisation de f.good() ou !f.eof() dans la condition de boucle peut entraîner la lecture double de la dernière ligne. En effet :

  • f.good(): Vérifie uniquement si aucune erreur n'a été rencontrée jusqu'à présent, mais n'indique pas si la prochaine opération (par exemple, getline) réussira.
  • !f.eof(): Vérifie si le flux n'a pas encore atteint la fin du fichier, mais ne garantit pas que la prochaine opération réussira.

À la fin du fichier, il peut y avoir une ligne incomplète ou mal formée qui provoque l'échec de getline. Si f.good() ou !f.eof() est utilisé dans la condition de boucle, la boucle continue même après l'échec de getline, entraînant la relecture de la dernière ligne valide.

Corriger l'état du flux Gestion

Pour éviter ce problème, l'état du flux doit être vérifié après avoir effectué l'opération de saisie souhaitée. Cela peut être fait en utilisant les techniques suivantes :

  • Après getline :

    if (getline(stream, line)) {
        use(line);
    } else {
        handle_error();
    }
    Copier après la connexion
  • Après Operator>> :

    if (stream >> foo >> bar) {
        use(foo, bar);
    } else {
        handle_error();
    }
    Copier après la connexion

Pour lire et traiter toutes les lignes, la construction de boucle suivante est recommandée :

for (std::string line; getline(stream, line);) {
    process(line);
}
Copier après la connexion

Cette boucle se termine automatiquement lorsque getline ne parvient pas à lire une autre ligne.

Remarque sur good()

La fonction good() peut être nommée de manière trompeuse. Cela indique seulement qu'aucune erreur n'a été rencontrée jusqu'à présent, mais cela n'implique pas que la prochaine opération réussira. Par conséquent, il n'est généralement pas recommandé d'utiliser good() pour prédire le résultat des futures opérations d'entrée.

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