Question

Je reçois une erreur de désactivation lors de l'exécution du code suivant

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main (int argc, char* argv[]){
    string tokens,input;
    input = "how are you";
    istringstream iss (input , istringstream::in);
    while(iss){
        iss >> tokens;
        cout << tokens << endl;
    }
    return 0;

}

Il imprime le dernier jeton "vous" deux fois, mais si je fais les modifications suivantes, tout fonctionne bien.

 while(iss >> tokens){
    cout << tokens << endl;
}

Quelqu'un peut-il m'expliquer comment fonctionne la boucle while. Merci

Était-ce utile?

La solution

C'est correct. La condition while(iss) échoue uniquement Après avoir lu au-delà de la fin du flux. Donc, après avoir extrait "you" De votre flux, ce sera toujours vrai.

while(iss) { // true, because the last extraction was successful

Vous essayez donc d'extraire plus. Cette extraction échoue, mais n'affecte pas la valeur stockée dans tokens, donc il est à nouveau imprimé.

iss >> tokens; // end of stream, so this fails, but tokens sill contains
               // the value from the previous iteration of the loop
cout << tokens << endl; // previous value is printed again

Pour cette raison même, vous devez toujours utiliser la deuxième approche que vous montrez. Dans cette approche, la boucle ne sera pas entrée, si la lecture n'a pas réussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top