Maison > développement back-end > C++ > Pourquoi `ifstream::eof()` se comporte-t-il différemment avec `get()` et l'opérateur d'extraction (`>>`) ?

Pourquoi `ifstream::eof()` se comporte-t-il différemment avec `get()` et l'opérateur d'extraction (`>>`) ?

DDD
Libérer: 2024-12-02 06:36:11
original
937 Les gens l'ont consulté

Why Does `ifstream::eof()` Behave Differently with `get()` and the Extraction Operator (`>>`) ?
>` ? " />

Plonger dans la fonction eof() d'ifstream

Comprendre le comportement de la fonction eof() d'ifstream peut être déroutant, comme illustré dans l'extrait de code fourni :

</p>
<h1>inclure <iostream></h1>
<h1>include <fstream></h1>
<p>int main() {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">std::fstream inf( "ex.txt", std::ios::in );
while( !inf.eof() ) {
    std::cout << inf.get() << "\n";
}
inf.close();
inf.clear();
inf.open( "ex.txt", std::ios::in );
char c;
while( inf >> c ) {
    std::cout << c << "\n";
}
return 0;
Copier après la connexion

}

Examinons l'explication fournie :

Quand EOF Vraiment défini dans

La fonction eof() détecte lorsqu'une opération de lecture tente d'accéder aux données au-delà de la fin du fichier. Cela signifie que :

  • Si vous avez un. fichier avec le contenu "abc" et lisez 3 caractères, eof() sera faux.
  • Mais si vous essayez de lire un 4ème caractère, eof() deviendra true, indiquant que la fin du fichier a été atteinte.

La raison de ce comportement est d'assurer la compatibilité avec différents appareils, tels que les tuyaux et les sockets, où le concept de taille de fichier peut ne pas être aussi simple qu'avec un fichier texte.

Dévoilement de la magie de get() et >>

Les deux les boucles dans l'extrait de code utilisent différentes approches pour lire le contenu du fichier :

  • La première boucle utilise inf.get() pour récupérer les caractères un par un. Lorsque la fin du fichier est atteinte, get() renvoie -1.
  • La deuxième boucle utilise inf >> c, qui combine une tentative de lecture et une affectation en une seule opération. Cette approche définit c sur la valeur lue dans le fichier, mais si la lecture échoue (en raison de l'atteinte de la fin du fichier), elle est évaluée à false, mettant fin à la boucle.

Cela explique pourquoi le la première boucle lit un caractère supplémentaire et affiche -1, tandis que la deuxième boucle donne le résultat correct – elle termine la boucle avant de tenter de lire au-delà de la fin du fichier.

Éviter les périls de -1

Pour éviter de s'appuyer sur le nombre magique -1 pour identifier la fin du fichier, il est recommandé d'utiliser std::char_traits::eof() ou std ::istream::traits_type::eof() à la place.

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
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal