11
votes

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

J'ai besoin de savoir si le prochain caractère en ifstream est la fin du fichier. J'essaie de le faire avec .Pek () : xxx

et xxx

mais aucun travail . Il y a un moyen de faire cela?

EDIT: Ce que j'essaie de faire est d'ajouter une lettre à la fin de chaque mot dans un fichier. Pour ce faire, je vous demande si le prochain caractère est une marque de ponctuation, mais de cette manière, le dernier mot est laissé sans une lettre supplémentaire. Je travaille juste avec char , pas chaîne .


3 commentaires

Vous ne devriez pas avoir à. Il ne vous dira pas si la prochaine lecture échouera ou non. Qu'est-ce que vous essayez d'accomplir?


Qu'essayez-vous de réaliser cela vous permet de savoir. Peut-être que si vous décrivez le problème plus important, nous pouvons suggérer comment résoudre le problème.


Si vous voulez vraiment tester contre EOF, essayez si (fichier.peek () == ifstream :: traits_type :: eof ()) . Mais comme le souligne LittleadV, Peek () définira réellement le bit EOF sur le flux lui-même. Alors que RubenVB souligne, que essayez-vous de faire?


8 Réponses :


2
votes

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

donc, au lieu de si (fichier.peek () == fichier.eof ()) vous devez avoir si (true == fichier.eof ()) Après une lecture (ou un coup d'œil) pour vérifier si vous avez atteint la fin du fichier (ce que vous essayez de faire, si je comprends correctement).


3 commentaires

C'est faux, le bit EOF est uniquement défini après vous avez lu à la fin du fichier.


Non. FILE.EOF () est défini après une tentative de lecture de la fin. Cela ne vous dit pas si vous venez d'atteindre la fin.


Clarifié pour répondre à vos commentaires.



8
votes

Cela devrait fonctionner: xxx

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


0 commentaires

1
votes

Il n'y a aucun moyen de dire si le caractère suivant est la fin du fichier et tente de le faire est l'une des erreurs les plus courantes que les nouveaux programmeurs C et C ++ font, 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 après la position actuelle dans un flux aura lieu au-delà de la fin du fichier, mais il s'agit en général assez inutiles. Vous devez plutôt tester toutes les opérations de lecture de succès ou de défaillance et agissez à ce statut.


0 commentaires

1
votes

généralement pour vérifier la fin du fichier que j'ai utilisé: xxx

un autre moyen de mettre en œuvre .. xxx

Informations supplémentaires serait utile afin que nous sachions ce que vous voulez faire.


6 commentaires

@Neil Butterworth - Ce sont des extraits de code que j'ai utilisé dans mes missions de l'université, mais l'esprit expliquant pourquoi ils ont tort? ^^


@TF Vous devriez vérifier le résultat de chaque opération de lecture (et d'écriture), comme ils se produisent, pas l'état du flux avant de les faire.


@TF: check Cette question


Ils ont tort parce que lire (l'appel système sur lequel iOSTreams sont finalement construits) uniquement des signaux finement de fichier lorsque vous essayez de lire passé la fin du fichier, Pas lorsque vous lisez jusqu'à la fin du fichier. Vous avez probablement eu une opération d'entrée à l'intérieur de cette boucle et vous n'avez pas la peine de vérifier si elle réussissait, et je pourrais donc créer une contribution qui briserait votre programme. Votre instructeur aurait dû le signalier.


@Nail Butterworth, merci pour l'illumination. @Xeo, merci de me faire remarquer cette question; C'était très utile.


@Zack, mon instructeur ne se souciait pas vraiment de la façon dont nous avons écrit nos programmes, tant qu'ils ont émis les bonnes choses et ont attribué les bons pointres et ce que rien. C'est pourquoi je me suis inscrit à Stackoverflow. (Y)



25
votes

istream :: Peek () code> Renvoie la constante EOF code> (qui est pas em> garantie égale à -1) lorsqu'il détecte la fin de fichier ou d'erreur em>. Pour vérifier de manière robuste pour la fin de fichier, faites ceci:

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


2 commentaires

Dans 100% casher C ++, EOF est std :: ifstream :: traits_type :: eof () .


std :: ifstream :: traits_type est std :: char_traits et std :: char_traits :: eof () est défini comme étant eof . C ++ 98 [lib.char.traits.specializations.char] / 7. Si vous utilisiez un large flux, vous devez utiliser weof , et si vous utilisiez basic_ifstream avec votre propre classe de traits, vous utiliseriez bien sûr que eof () , mais je ne vois aucune raison de mentionner le code de migration avec des références au type de traits quand il n'est pas nécessaire.



2
votes

Pour un flux connecté au clavier, la condition EOF est que j'ai l'intention de taper Ctrl + D / CTRL + Z lors de la prochaine entrée.

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


2 commentaires

Pourquoi pas? Peek () Bloquera heureusement que vous avez pris votre décision.


@Chals - Oui, s'il lit un seul caractère à la fois. Il a oublié de mentionner cela au début.



0
votes

Vous n'avez montré aucun code avec lequel vous travaillez, il y a donc des deviner de ma part. Vous n'avez généralement pas besoin d'installations de niveau bas (comme Peek () code>) lorsque vous travaillez avec des flux. Ce que vous êtes probablement intéressé, c'est istream_iterator code>. Voici un exemple, xxx pré>

Vous pouvez également utiliser IstreamBuf_iterator pour fonctionner directement sur la mémoire tampon: P>

  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 commentaires

0
votes

Utilisez simplement ce code dans MacOSX

if (true == file.eof())


0 commentaires