Comment savoir si le prochain caractère est EOF en C ++
Je suis besoin de savoir si le caractère suivant dans ifstream
est la fin du fichier. Je suis en train de le faire avec .peek()
:
if (file.peek() == -1)
et
if (file.peek() == file.eof())
Mais aucun ne fonctionne. Il y a une façon de le faire?
Edit: Ce que j'essaie de faire est d'ajouter une lettre à la fin de chaque mot dans un fichier. Pour ce faire je me demande si le caractère suivant est un signe de ponctuation, mais de cette façon, le dernier mot est laissé sans une lettre supplémentaire. Je travaille juste avec char
pas string
.
source d'informationauteur Tae
Vous devez vous connecter pour publier un commentaire.
istream::peek()
renvoie la constanteEOF
(qui est pas la garantie d'être égal à -1) lorsqu'il détecte fin-de-fichier ou d'erreur. Pour vérifier robuste pour le fin-de-fichier, faites ceci:Vous devriez savoir que l'OS sous-jacent primitive,
read(2)
seuls les signaux EOF lorsque vous essayez de lire passé la fin du fichier. Par conséquent,file.eof()
ne sera pas le cas lorsque vous avez simplement lu jusqu'à le dernier caractère dans le fichier. En d'autres termes,file.eof()
être faux ne signifie pas que la prochaine opération de lecture va réussir.Cela devrait fonctionner:
Mais pourquoi ne pas vérifier les erreurs après avoir fait une tentative de lecture des données utiles?
Pour un flux de données reliée au clavier eof la condition est que j'ai l'intention de taper Ctrl+D/Ctrl+Z lors de la prochaine entrée.
peek()
est totalement incapable de voir que. 🙂file.eof()
renvoie une valeur d'indicateur. Elle est définie à TRUE si vous ne pouvez plus lire à partir du fichier. EOF est pas un personnage, il est un marqueur de l'OS. Donc, quand vous êtes là -file.eof()
devrait êtretrue
.Ainsi, au lieu de
if (file.peek() == file.eof())
vous devriez avoirif (true == file.eof())
après une lecture (ou lire) pour vérifier si vous avez atteint la fin du fichier (qui est ce que vous êtes en train de faire, si je comprends bien).Il n'y a aucun moyen de savoir si le caractère suivant est la fin du fichier, et en essayant de le faire est l'une des plus fréquentes d'erreurs que les nouveaux C et C++ pour les programmeurs, car il n'y a pas de fin-de-fichier de caractère dans la plupart des systèmes d'exploitation. Ce que vous pouvez dire est que la lecture du passé de la position actuelle dans un train de lire au-delà de la fin du fichier, mais c'est en général assez d'informations inutiles. En revanche, vous pouvez tester toutes les opérations de lecture de la réussite ou de l'échec, et agir sur ce statut.
Généralement à vérifier à la fin du fichier que j'ai utilisé:
Une autre façon de mettre en œuvre ce serait..
Des informations supplémentaires pourraient vous être utile, donc nous savons ce que vous voulez faire.
Vous n'avez pas de code, il y a donc de deviner de ma part. Vous n'avez généralement pas besoin de bas niveau (comme
peek()
) lorsque l'on travaille avec des cours d'eau. Ce que vous avez probablement intéressé estistream_iterator
. Voici un exemple,Vous pouvez également utiliser istreambuf_iterator de travailler sur le tampon directement: