2009-07-20 18 views
2

Ich habe ein Problem mit dem Extrahieren von Daten aus einem stringstream. Am Anfang meiner Extraktion fehlen die ersten beiden Zeichen.Stringstream-Extraktion funktioniert nicht

Ich habe etwas ähnliches wie den folgenden Code:

std::stringstream ss(
    std::stringstream::in | 
    std::stringstream::out 
    ); 

    bool bValid; 
    double dValue; 
    double dTime; 

    for((int i = 0; i < 5; i++) 
    { 
     bValid = getValid(); 
     dValue = getValue(); 
     dTime = getTime(); 

     // add data to stream 
     ss << bValid; 
     ss << dValue; 
     ss << dTime; 
    } 

    int strsize = ss.str().size(); 
    char* data = new char[strsize]; 
    std::strcpy(data, ss.str().c_str()); 

    // then do stuff with data 
    // ...... store data in an Xml Node as CDATA 

    // read data back 
    std::stringstream ssnew(std::stringstream in | std::stringstream out); 
    ss.clear(); 
    ss << getCharData(); // returns a char* and puts it in stream. 

    for(int i = 0; i < 5; i++) 
    { 
     ssnew >> bValid; // do something with bValid 
     ssnew >> dValue; // do something with dValue 
     ssnew >> dTime; // do something with dTime 
    } 

ich ein Problem habe, dass, wenn ich den Extraktionsoperator beim Lesen von Daten aus „ssnew“ den ersten beiden Zeichen zu überspringen scheint. Im Debugger wird beispielsweise angezeigt, dass der Stringstream "001.111.62.2003 ... etc" hat. Jedoch wird nach dem ersten "ssnew >> bValid" bValid "wahr" und dValue wird "0,111" und dTime wird "0,62", was anzeigt, dass die ersten zwei Nullen im Strom ignoriert werden. Warum fängt es nicht am Anfang des Streams an?

Cheers, Seth

Antwort

2

Versuchen:

// add data to stream 
    ss << bValid << " "; 
    ss << dValue << " "; 
    ss << dTime << " "; 
+0

das hat funktioniert! Aber hätte es nicht anders funktionieren sollen? – Seth

+0

Nein, sollte es nicht haben. Um zu verstehen warum, nehmen wir an, Sie tun etwas wie int x = 1, y = 11, z = 111; ss << x << y << z; - Dies ergibt die Zeichenfolge "111111", und der Stream kann nicht sagen, wie man x, y und z nach Belieben extrahiert (im Gegensatz zu den anderen Möglichkeiten). In der Tat: Angesichts genau dieser Schnur konnte ein Mensch es auch nicht sagen. Es ist wirklich nur eine einfache Zeichenfolge, über die wir hier reden; Es gibt keine Trennzeichen, um die Felder zu trennen, es sei denn, Sie schreiben explizit einige. – Reunanen

+0

Um zu erklären, der Grund, warum es nicht funktioniert, sind Boole manchmal als (in der Regel 8-Bit) Ganzzahlen behandelt, nicht einzelne Zeichen. Wie Pukku sagte, ist es beim Lesen der Zeichenfolge, die nach "Ganzzahlen" sucht, unmöglich zu sagen, wo man aufhört und eine andere ohne Leerzeichen oder einen anderen Begrenzer beginnt. – SoapBox

0

Der Grund Ihrer ursprünglichen Code ist funktionierte nicht, dass die Extraktion gierig war, so ssnew >> bValid die "001" verschlungen.

Beachten Sie, dass strstream zugunsten von stringstream veraltet ist.

Verwandte Themen