2010-09-21 7 views
6

Je voulais expérimenter avec Stringstream pour une tâche, mais je suis un peu confus sur la façon dont cela fonctionne. J'ai fait une recherche rapide mais je n'ai rien trouvé qui puisse répondre à ma question.comment lire stringstream avec la taille dynamique?

Dites que j'ai un flux avec une taille dynamique, comment pourrais-je savoir quand arrêter d'écrire dans la variable?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

et ma sortie serait:

2 
++ 
asdf 
3 
* 
c 
c 

Je ne sais pas pourquoi je reçois que 'c' supplémentaire à la fin, d'autant plus que _M_in_cur = 0x1001000d7 ""

+0

Le fait que ce soit une chaîne de caractères ne change pas grand-chose - vous y lisez comme vous le feriez pour n'importe quel autre flux. –

Répondre

17

Vous obtenez le c supplémentaire à la fin parce que vous ne testez pas si le courant est encore bon après avoir effectué l'extraction:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

Vous devez tester l'état du flux entre l'extraction et l'utilisation du résultat. Typiquement, cela se fait en effectuant l'extraction dans la condition de la boucle:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

Merci, je suppose que ma question aurait dû être formulée comme comment vérifier l'état du flux. –

+0

@ thomast.sang accepter sa réponse. – gsamaras

-1

Il y a aussi une bonne fonction membre() qui teste si le flux peut être utilisé pour des opérations d'E/S. Donc, en utilisant ce code ci-dessus peut être modifié en

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

Ceci est toujours incorrect dans le cas général: si vous essayez d'extraire un 'int' et que les prochains caractères disponibles dans le tampon ne peuvent pas être lus comme un' int', l'extraction échouera. –

0

Le contrôle while(ss) état dans votre code vérifie si la dernière lecture du flux a réussi ou non. Cependant, cette vérification retournera vrai même si vous avez lu le dernier mot de votre chaîne. Seule l'extraction suivante de ss >> var dans votre code va rendre cette condition fausse puisque la fin du flux a été atteinte & il n'y a rien à extraire dans la variable var. C'est la raison pour laquelle vous obtenez un «c» supplémentaire à la fin. Vous pouvez éliminer cela en changeant votre code comme suggéré par James McNellis.