14 votes

Comment signifier qu'il n'y a plus d'entrée pour la chaîne ss dans la boucle while (cin >> ss)

J'ai utilisé "cin" pour lire les mots du flux d'entrée, qui ressemble à

int main( ){
     string word;
     while (cin >> word){
         //do sth on the input word
     }

    // perform some other operations
}

La structure du code est quelque chose comme celle ci-dessus. Il est compilable. Pendant l'exécution, je continue à entrer quelque chose comme

aa bb cc dd

Ma question est la suivante : comment terminer cette entrée ? En d'autres termes, supposons que le fichier texte soit simplement "aa bb cc dd". Mais je ne sais pas comment faire savoir au programme que le fichier se termine.

20voto

Mike Lewis Points 29305

Votre code est correct. Si vous étiez en train de saisir de manière interactive, vous devriez envoyer un caractère EOF, comme CTRL-D.

Ce caractère EOF n'est pas nécessaire lorsque vous lisez un fichier. En effet, une fois que vous avez atteint la fin de votre flux d'entrée, il n'y a plus rien à "cin" (car le flux est maintenant fermé), et la boucle while se termine.

7voto

Nawaz Points 148870

Comme d'autres ont déjà répondu à cette question, je voudrais ajouter ce point important :

Étant donné que Ctrl-Z sous Windows (et Ctrl-D sur les systèmes unix) provoque l'atteinte de EOF, et que vous sortez de la commande while mais en dehors de la boucle while vous ne pouvez pas lire d'autres entrées, puisque le EOF est déjà atteint.

Ainsi, pour permettre la lecture en utilisant cin Encore une fois, vous devez effacer eof et tous les autres drapeaux d'échec, comme indiqué ci-dessous :

cin.clear();

Après avoir fait cela, vous pouvez commencer à lire l'entrée en utilisant cin une fois de plus !

3voto

gotnull Points 4918
int main() {
     string word;
     while (cin >> word) {
         // do something on the input word.
         if (foo)
           break;
     }
    // perform some other operations.
}

1voto

jonsca Points 6571

Appuyez sur Ctrl-Z (Ctrl-D sur les systèmes *nix) et appuyez sur Entrée. Cela envoie un EOF et invalide le flux.

1voto

Null Set Points 4294

cin >> some_variable_or_manipulator sera toujours évalué comme une référence à cin . Si vous voulez vérifier et voir s'il y a encore des entrées à lire, vous devez faire quelque chose comme ceci :

int main( ){
     string word;
     while (cin.good()){
         cin >> word;
         //do sth on the input word
     }

    // perform some other operations
}

Ceci vérifie le goodbit du flux, qui est mis à true quand aucun des eofbit, failbit, ou badbit n'est mis à true. S'il y a une erreur de lecture, ou si le flux a reçu un caractère EOF (en atteignant la fin d'un fichier ou par l'utilisateur au clavier en appuyant sur CTRL+D), cin.good() retournera false, et vous sortira de la boucle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X