2010-11-20 11 views
2

Gibt es eine while-Schleife, mit der ich alle Werte für einen stringstream in einen Datentyp eingeben kann? Zum Beispiel:Werte von stringstream eingeben

stringstream line; 
while(/*there's still stuff in line*/) 
{ 
    string thing; 
    line >> thing; 
    //do stuff with thing 
} 

Antwort

2

Ja:

std::stringstream line; 
std::string thing; 
while (line >> thing) 
{ 
    // do stuff with thing 
} 

if (line.fail()) 
{ 
    // an error occurred; handle it as appropriate 
} 

Stream-Operationen (wie >>), um den Strom zurückzukehren; das ist, was Sie zu Ketten Stream-Operationen ermöglicht, wie:

line >> x >> y >> z 

Ein Strom kann als boolean verwendet werden; Wenn der Stream in einem guten Zustand ist (dh, wenn Daten von ihm gelesen werden können), wird true; Ansonsten wird false ausgewertet. Deshalb können wir den Stream als Bedingung in der Schleife verwenden.

Es gibt eine Reihe von Gründen, warum ein Stream nicht in einem guten Zustand ist.

Einer von ihnen ist, wenn Sie das Ende des Streams erreichen (angezeigt durch Test line.eof()); Wenn Sie versuchen, alle Daten aus dem Stream zu lesen, ist dies der Zustand, in dem Sie den Stream erwarten, wenn Sie fertig sind. Die anderen zwei Gründe, warum ein Stream nicht in einem guten Zustand ist, sind ein interner Fehler oder eine Operation im Stream, die fehlgeschlagen ist (wenn Sie beispielsweise versuchen, eine Ganzzahl zu extrahieren, die nächsten Daten im Stream jedoch nicht) eine ganze Zahl darstellen). Beide werden von line.fail() getestet.

+0

Beat mich, ich tippte immer noch! '+ 1' – sbi

+0

' für (stringsache; zeile >> sache;) {use (thing); } 'Wenn die Bedingung in einer unserer Schleifen fehlschlägt, ist line.fail() wahr; Sie müssten die Schleife unterbrechen, damit der Strom immer noch nicht funktioniert. Seien Sie vorsichtig mit guten (deshalb sage ich unfehlbar), denn! Stream.fail() ist nicht identisch mit stream.good(). –