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
das hat funktioniert! Aber hätte es nicht anders funktionieren sollen? – Seth
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
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