2009-10-09 8 views
2

J'ai essayé d'utiliser la classe Stringstream C++ pour effectuer des manipulations de chaînes relativement simples, mais j'ai un problème avec la méthode get(). Pour une raison quelconque, chaque fois que j'extrais le caractère de sortie par caractère, il ajoute une deuxième copie de la lettre finale.Stringstream C++ retournant caractère supplémentaire?

#include <iostream> 
#include <sstream> 
#include <string> 
using namespace std; 

int main() { 
    stringstream ss("hello"); 
    char c; 

    while(!ss.eof()) { 
     ss.get(c); 
     cout << "char: " << c << endl; 
    } 
    return 0; 
} 

La sortie du programme est:

char: h 
char: e 
char: l 
char: l 
char: o 
char: o 

Toute aide que vous pouvez me donner ce serait apprécié.

+0

Oui, c'est une faute de frappe. #include doit être #include Chris

Répondre

8

A la fin du flux ss.eof() ne sait pas encore que la fin du flux sera bientôt atteint, mais l'extraction suivante d'un caractère échoue. Puisque l'extraction a échoué parce que la fin du flux a été atteinte, c n'est pas modifiée. Votre programme ne reconnaît pas que ss.get(c) a échoué et imprime cette ancienne valeur de c à nouveau.

Une meilleure façon de vérifier s'il y a encore un caractère qui peut être lu à partir du flux serait une boucle comme ceci:

while (ss.get(c)) { 
    cout << "char: " << c << endl; 
} 
+0

et ici vous comptez sur la commodité des flux standards ayant l'opérateur bool() défini. – wilhelmtell

+0

Merci beaucoup pour votre réponse rapide et votre explication détaillée. – Chris

2

en raison de l'ordre de la boucle. Votre lecture le \ 0 et EOF.

votre code réordonner comme celui-ci

int main() { 
    stringstream ss("hello"); 
    char c; 

    ss.get(c); 
    while(!ss.eof()) { 
     cout << "char: " << c << endl; 
     ss.get(c); 
    } 
    return 0; 
} 
+0

où avez-vous vu \ n? – leiz

+1

oooops .. typo .. je pensais \ 0 et tapé \ n .. –

1

Le drapeau EOF est uniquement défini si vous essayez de lire après la fin du fichier. Le code suivant résout le problème en testant EOF après le get() au lieu d'avant:

#include <iostream> 
#include <sstream> 
#include <string> 
using namespace std; 

int main() { 
    stringstream ss("hello"); 
    char c; 

    while(1) { 
     ss.get(c); 
     if(ss.eof()) 
      break; 

     cout << "char: " << c << endl; 
    } 
    return 0; 
} 
Questions connexes