2010-09-21 7 views
6

Ich wollte mit Stringstream für eine Aufgabe experimentieren, aber ich bin ein wenig verwirrt, wie es funktioniert. Ich suchte schnell, konnte aber nichts finden, was meine Frage beantworten würde.Wie liest man Stringstream mit dynamischer Größe?

Angenommen, ich habe einen Stream mit einer dynamischen Größe, woher soll ich wissen, wann ich aufhören soll, in die Variable zu schreiben?

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

ss << var; 

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

und meine Ausgabe wäre:

2 
++ 
asdf 
3 
* 
c 
c 

Ich bin mir nicht sicher, warum ich, dass zusätzliche 'c' erhalten am Ende, zumal _M_in_cur = 0x1001000d7 ""

+0

Die Tatsache, dass es ein Stringstream ist ändert nichts von viel - Sie lesen daraus wie jeder andere Stream. –

Antwort

17

Sie erhalten die extra c am Ende, weil Sie nicht testen, ob der Strom immer noch gut ist, nachdem Sie die Extraktion durchführen:

Sie müssen den Stream-Status zwischen dem Ausführen der Extraktion und dem Verwenden des Ergebnisses testen. Typischerweise wird dies durch die Durchführung der Extraktion in der Schleifenbedingung durchgeführt:

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

Danke, ich denke, meine Frage sollte so formuliert sein, wie man den Zustand des Streams überprüft. –

+0

@ thomast.sang akzeptiere seine Antwort. – gsamaras

-1

Es gibt auch eine Elementfunktion gut(), der prüft, ob der Strom für die E/A-Operationen verwendet werden kann. Also mit dieser der obigen Code kann in

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

Dies ist im allgemeinen Fall immer noch falsch: Wenn Sie versuchen, ein 'int' zu extrahieren und die nächsten verfügbaren Zeichen im Puffer nicht als' int' gelesen werden können, schlägt die Extraktion fehl. –

0

Die while(ss) Bedingungsprüfung in Ihrem Code überprüft, geändert werden, wenn die letzte Lese aus dem Stream erfolgreich war oder nicht. Diese Überprüfung wird jedoch auch dann wahr zurückgegeben, wenn Sie das letzte Wort in Ihrer Zeichenfolge gelesen haben. Nur die nächste Extraktion von ss >> var in Ihrem Code wird diese Bedingung falsch machen, da das Ende des Streams erreicht wurde & gibt es nichts in die Variable Var zu extrahieren. Dies ist der Grund, warum du am Ende ein extra 'C' bekommst. Sie können dies beheben, indem Sie Ihren Code wie von James McNellis vorgeschlagen ändern.