Question

Je regardais cet article sur Cplusplus.com, http: // www .cplusplus.com / référence / iostream / istream / coup d'oeil /

Je ne suis toujours pas sûr de ce coup d'oeil () si elle atteint la fin du fichier.

Dans mon code, une partie du programme est censé fonctionner aussi longtemps que cette affirmation est vraie

(sourcefile.peek() != EOF)

où sourcefile est mon ifstream.

Cependant, il ne cesse de boucle, même si elle a atteint la fin du fichier.

ne veut pas dire EOF "End of File"? Ou étais-je l'utilise mal?

Était-ce utile?

La solution

Consultation de la norme,

  

Retours: traits::eof() ifgood()isfalse. Dans le cas contraire, returnsrdbuf()->sgetc().

En ce qui concerne sgetc(),

  

Renvoie:. Si la séquence d'entrée position lecture ne sont pas disponibles, les retours underflow()

underflow,

  

Si la séquence en attente est NULL, la fonction retourne traits::eof() pour indiquer l'échec.

yep, retours EOF la fin du fichier.

Une façon plus facile de dire est qu'il retourne int_type. Étant donné que les valeurs de int_type ne sont que celles de char_type, plus EOF, il retournerait probablement char_type si EOF n'était pas possible.

Comme d'autres ont mentionné, peek ne fait pas avancer la position de fichier. Il est généralement plus facile et mieux à boucle juste sur while ( input_stream ) et laisser l'impossibilité d'obtenir l'entrée supplémentaire tuer le processus d'analyse syntaxique.

Autres conseils

Les choses qui me viennent à l'esprit (sans voir votre code).

  • EOF pourrait être défini différemment que prévu
  • sourcefile.peek() ne fait pas avancer le pointeur de fichier. Est-ce que vous avancez en quelque sorte manuellement, ou vous cherchez peut-être constamment au même caractère?

EOF est pour les fonctions de style C âgées. Vous devez utiliser istream::traits_type::eof().

Modifier : l'affichage des commentaires me persuade que istream::traits_type::eof() est garanti pour retourner la même valeur que EOF, à moins que par hasard EOF a été redéfini dans le contexte de votre bloc source. Alors que le conseil est toujours OK, c'est pas la réponse à la question affichée.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//myifstream_peek1.cpp
int main()
{
 char ch1, ch2;
 ifstream readtext2;
 readtext2.open("mypeek.txt");
 while(readtext2.good())
 {
 if(readtext2.good())
 {
  ch2 = readtext2.get();   cout<< ch2;
 }
 }
   readtext2.close();
 //
 ifstream readtext1;
 readtext1.open("mypeek.txt");
 while(readtext1.good())
    {
    if(readtext1.good())
     {

        ch2 = readtext1.get();
        if(ch2 ==';')
            {
             ch1= readtext1.peek();
             cout<<ch1;  exit(1);
            }
            else {  cout<<ch2; }
        }

    }
    cout<<"\n end of ifstream peeking";
   readtext1.close();
return 0;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top