web-dev-qa-db-fra.com

Comment savoir si le prochain caractère est EOF en C++

Je dois savoir si le caractère suivant dans ifstream est la fin du fichier. J'essaie de faire cela avec .peek():

if (file.peek() == -1)

et 

if (file.peek() == file.eof())

Mais ni fonctionne. Il y a un moyen de faire ça?

Edit: Ce que j'essaie de faire est d'ajouter une lettre à la fin de chaque mot d'un fichier. Pour ce faire, je demande si le caractère suivant est un signe de ponctuation, mais de cette manière, le dernier mot est laissé sans lettre supplémentaire. Je travaille uniquement avec char, pas string.

10
Tae

istream::peek() renvoie la constante EOF (qui est not sera égale à -1) lorsqu’il détectera la fin du fichier ou une erreur . Pour vérifier correctement la fin du fichier, procédez comme suit:

int c = file.peek();
if (c == EOF) {
  if (file.eof())
    // end of file
  else
    // error
} else {
  // do something with 'c'
}

Vous devez savoir que la primitive du système d'exploitation sous-jacente, read(2) , ne signale que EOF lorsque vous essayez de lire past la fin du fichier. Par conséquent, file.eof() ne sera pas vrai si vous avez simplement lu jusqu'à le dernier caractère du fichier. En d'autres termes, file.eof() étant faux ne signifie pas que la prochaine opération de lecture réussira.

22
zwol

Cela devrait fonctionner:

if (file.peek(), file.eof())

Mais pourquoi ne pas simplement vérifier les erreurs après avoir tenté de lire des données utiles?

8
Ben Voigt

Pour un flux connecté au clavier, la condition eof est que je compte taper Ctrl + D/Ctrl + Z lors de la prochaine entrée. 

peek() est totalement incapable de voir cela. :-)

2
Bo Persson

file.eof() renvoie une valeur d'indicateur. Il est défini sur TRUE si vous ne pouvez plus lire à partir d'un fichier. EOF n'est pas un caractère réel, c'est un marqueur pour le système d'exploitation. Donc, lorsque vous êtes sur place - file.eof() devrait être true.

Donc, au lieu de if (file.peek() == file.eof()), vous devriez avoir if (true == file.eof()) après une lecture (ou un aperçu) pour vérifier si vous avez atteint la fin du fichier (ce que vous essayez de faire, si je comprends bien).

1
littleadv

Il n'y a aucun moyen de savoir si le prochain caractère est la fin du fichier et essayer de le faire est l'une des erreurs les plus courantes commises par les nouveaux programmeurs C et C++, car il n'y a pas de caractère de fin de fichier dans la plupart des systèmes d'exploitation. . Ce que vous pouvez dire, c'est que lire au-delà de la position actuelle dans un flux lira au-delà de la fin du fichier, mais il s’agit en général d’une information plutôt inutile. Vous devriez plutôt tester toutes les opérations de lecture pour connaître le succès ou l'échec et agir sur ce statut.

1
Neil Butterworth

Vous n'avez montré aucun code avec lequel vous travaillez, alors il y a des devinettes de ma part. Vous n'avez généralement pas besoin d'installations de bas niveau (telles que peek()) lorsque vous travaillez avec des flux. Ce qui vous a probablement intéressé est istream_iterator. Voici un exemple,

  cout << "enter value";

  for(istream_iterator<double> it(cin), end; 
      it != end; ++it)
  {
     cout << "\nyou entered value " << *it;
     cout << "\nTry again ...";
  }

Vous pouvez également utiliser istreambuf_iterator pour travailler directement sur le tampon:

  cout << "Please, enter your name: ";

  string name;
  for(istreambuf_iterator<char> it(cin.rdbuf()), end;
    it != end && *it != '\n'; ++it)
  {
    name += *it;
  }
  cout << "\nyour name is " << name;
0
Gene Bushuyev

Habituellement pour vérifier la fin du fichier que j'ai utilisé:

    if(cin.fail())
    {
        // Do whatever here
    }

Une autre façon de mettre en œuvre ce serait ..

    while(!cin.fail())
    {
        // Do whatever here
    }

Des informations supplémentaires seraient utiles pour que nous sachions ce que vous voulez faire.

0
tf.rz