web-dev-qa-db-fra.com

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 aiment

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

    // perform some other operations
}

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

aa bb cc dd

Ma question est de savoir comment mettre fin à cette entrée? En d'autres termes, supposons que le fichier texte soit juste "aa bb cc dd". Mais je ne sais pas comment faire savoir au programme que le fichier se termine.

12
user630983

Votre code est correct. Si vous saisissiez de façon interactive, vous auriez besoin d'envoyer un caractère EOF, tel que CTRL-D. 

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

17
Mike Lewis

Comme d’autres répondent déjà à cette question, je voudrais ajouter ce point important:

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

Donc, pour permettre la lecture en utilisant à nouveau cin, vous devez effacer l'indicateur eof et tous les autres indicateurs d'échec, comme indiqué ci-dessous:

cin.clear();

Après cela, vous pouvez commencer à lire l’entrée en utilisant cin encore une fois!

5
Nawaz
int main() {
     string Word;
     while (cin >> Word) {
         // do something on the input Word.
         if (foo)
           break;
     }
    // perform some other operations.
}
3
fuzz

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

1
jonsca

cin >> some_variable_or_manipulator sera toujours considéré 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 bon débit du flux, qui est défini sur true lorsqu'aucun des paramètres eofbit, failbit ou badbit n'est défini. En cas d'erreur de lecture ou si le flux a reçu un caractère EOF (pour atteindre la fin d'un fichier ou par l'utilisateur au clavier en appuyant sur CTRL + D), cin.good () retournera false, et vous sortir de la boucle.

1
Null Set

Je suppose que vous voulez sortir à la fin du fichier. Vous pouvez obtenir la valeur de basic_ios :: eof , elle renvoie la valeur true à la fin du flux.

0
Nickolas

Prendre l'entrée d'un fichier. Ensuite, vous constaterez que la boucle while se termine lorsque votre programme cesse de prendre des entrées. En fait, cin cesse de prendre des mesures lorsqu'il trouve un marqueur EOF. Chaque fichier d'entrée se termine par ce marqueur EOF. Lorsque ce marqueur EOF est rencontré par operator>>, il modifie la valeur du drapeau interne eofbit en false et, par conséquent, la boucle while s'arrête. 

0
Mostafiz Rahman

Cela m'aide à terminer la boucle en appuyant sur ENTER.

int main() {
    string Word;
    while(getline(cin,Word) && s.compare("\0") != 0) {
        //do sth on the input Word
    }

    // perform some other operations
}
0
Eldar

Vous pouvez vérifier si un mot spécial est entré. F.e. "Arrêtez":

int main( ){
   string Word;

   while (cin >> Word){
      if(Word == "stop")
          break;

      //do sth on the input Word
   }

// perform some other operations
}
0
Serid