2009-07-20 4 views
2

У меня, похоже, проблема с извлечением данных из строкового потока. В начале моего извлечения, кажется, отсутствуют первые два символа.stringstream extract не работает

У меня есть что-то похожее на следующий код:

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 
    } 

Я имею проблему, что, когда я использую оператор извлечения при чтении данных из «ssnew», кажется, пропустить первые два символа. Например, в отладчике показано, что строка имеет «001.111.62.2003 ... и т. Д.». Однако после первого «ssnew >> bValid» bValid становится «true», а dValue становится «0.111», а dTime становится «0.62», что указывает на то, что первые два нуля в потоке игнорируются. Почему это не начинается с начала потока?

Приветствия, Сет

ответ

2

Try:

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

это сработало! но разве он не работал по-другому? – Seth

+0

Нет, этого не должно быть. Чтобы понять, почему, предположите, что вы делаете что-то вроде int x = 1, y = 11, z = 111; ss << x << y << z; - это приводит к строке «111111», и поток не может сказать, как извлечь x, y и z, как вам хотелось бы (в отличие от других возможностей). На самом деле: учитывая только эту цепочку, человек тоже не мог сказать. Это просто простая строка, о которой мы говорим; для разделения полей нет разделителей, если вы явно не пишете их. – Reunanen

+0

Чтобы уточнить, причина, по которой она не работает, - это bools, которые иногда рассматриваются как (обычно 8-битные) целые числа, а не отдельные символы. Так, как сказал Пукку, при чтении строки, ищущей «целые числа», невозможно сказать, где остановиться, а другая начинается без пробелов или какого-либо другого разделителя. – SoapBox

0

Причина исходный код не работает в том, что добыча была жадной, так ssnew >> bValid сожрал в "001".

Обратите внимание, что strstream устарел в пользу stringstream.

Смежные вопросы