Maison > développement back-end > C++ > Pourquoi mon code C lit-il deux fois la dernière ligne d'un fichier texte lors de la vérification d'EOF ?

Pourquoi mon code C lit-il deux fois la dernière ligne d'un fichier texte lors de la vérification d'EOF ?

Barbara Streisand
Libérer: 2024-12-27 15:20:15
original
961 Les gens l'ont consulté

Why Does My C   Code Read the Last Line of a Text File Twice When Checking for EOF?

Dépannage de la lecture EOF à partir de fichiers texte

Lors de la lecture d'un fichier texte jusqu'à ce que la fin du fichier (EOF) soit atteinte, il est important pour comprendre le comportement du flux d'entrée pour éviter la duplication de lignes.

En C , l'objet ifstream est utilisé pour lire du texte fichiers. Le code fourni illustre une approche courante pour lire des entiers à partir d'un fichier texte, mais il rencontre un problème où la dernière ligne est lue deux fois.

Comprendre le problème

Le Le problème survient car la fonction eof() vérifie EOF en fonction du pointeur interne du flux, qui est positionné après le dernier caractère du fichier lorsque EOF est atteint. Le code lit la dernière ligne une fois lorsqu'il rencontre l'entier et à nouveau lorsqu'il vérifie EOF dans la boucle.

Solution

Pour résoudre ce problème, il est conseillé de vérifier pour EOF avant de lire l’entier dans la boucle. Cela garantit que le dernier entier n'est lu qu'une seule fois :

while (!iFile.eof())
{
    if (iFile.peek() != EOF)
    {
        int x;
        iFile >> x;
        cerr << x << endl;
    }
}
Copier après la connexion

Ici, iFile.peek() vérifie le caractère suivant dans le flux sans le lire réellement. Si ce n'est pas EOF, alors l'entier est lu et affiché.

Approche alternative

De plus, le code peut être réécrit à l'aide de la fonction getline pour lire des lignes entières du fichier, puis analysez les entiers manuellement. Cette approche évite complètement le problème EOF :

ifstream iFile("input.txt");

while (getline(iFile, line))
{
    istringstream ss(line);
    int x;
    ss >> x;
    cerr << x << endl;
}
Copier après la connexion

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