J'ai besoin de savoir si le prochain caractère en et p> mais aucun travail . Il y a un moyen de faire cela? P> EDIT: strong> 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 ifstream code> est la fin du fichier. J'essaie de le faire avec
.Pek () code>:
char code>, pas
chaîne code>. P> p>
8 Réponses :
donc, au lieu de fichier.eof () code> 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 () code> doit être
true code>. P>
si (fichier.peek () == fichier.eof ()) code> vous devez avoir
si (true == fichier.eof ()) code> 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). P>
C'est faux, le bit EOF est uniquement défini après i> vous avez lu à la fin du fichier.
Non. FILE.EOF () CODE> 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.
Cela devrait fonctionner: Mais pourquoi ne pas simplement vérifier les erreurs après avoir tenté de lire des données utiles? p> p>
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. P>
généralement pour vérifier la fin du fichier que j'ai utilisé: un autre moyen de mettre en œuvre .. p> Informations supplémentaires serait utile afin que nous sachions ce que vous voulez faire. p> p>
@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 code> (l'appel système sur lequel iOSTreams sont finalement construits) uniquement des signaux finement de fichier lorsque vous essayez de lire passé i> la fin du fichier, Pas lorsque vous lisez jusqu'à i> 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)
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'
}
Dans 100% casher C ++, EOF code> est
std :: ifstream :: traits_type :: eof () code>.
std :: ifstream :: traits_type code> est
std :: char_traits
std :: char_traits
eof code>. C ++ 98 [lib.char.traits.specializations.char] / 7. Si vous utilisiez un large flux, vous devez utiliser
weof code>, et si vous utilisiez
basic_ifstream code> avec votre propre classe de traits, vous utiliseriez bien sûr que
eof () code>, 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.
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. p>
peek () code> est totalement incapable de voir cela. : -) p>
Pourquoi pas? Peek () Code> 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.
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 Vous pouvez également utiliser IstreamBuf_iterator pour fonctionner directement sur la mémoire tampon: P> Peek () code>) lorsque vous travaillez avec des flux. Ce que vous êtes probablement intéressé, c'est
istream_iterator code>. Voici un exemple,
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;
Utilisez simplement ce code dans MacOSX
if (true == file.eof())
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 ()) code>. Mais comme le souligne LittleadV,
Peek () Code> définira réellement le bit EOF sur le flux lui-même. Alors que RubenVB souligne, que essayez-vous de faire?