2009-07-20 8 views
2

ストリングストリームからデータを抽出する際に問題があるようです。私の抽出の開始は、最初の2文字が欠けているようです。ストリングストリーム抽出が機能しない

私は、次のコードに似た何かを持っている:私は「ssnew」からデータを読み込むときに、私は抽出演算子を使用する場合、最初の2つの文字を飛ばしているようだという問題が生じています

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 
    } 

を。たとえば、デバッガでは、stringstreamに "001.111.62.2003 ... etc"が表示されています。しかし、最初の "ssnew >> bValid" bValidが "true"になり、dValueが "0.111"になり、dTimeが "0.62"になってストリームの最初の2つのゼロが無視されていることを示します。なぜストリームの始めから始まっていないのですか?

乾杯、 セス

答えて

2

試してみてください。あなたの元のコードは動作しませんでした

// 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

詳しくは、boolは時には(通常は8ビットの)整数として扱われ、単一の文字ではないという理由で動作しません。だからPukkuが言ったように、 "整数"を探している文字列を読むときは、どこが停止し、別のものがスペースや他の区切り文字なしで始まるかを知ることは不可能です。 – SoapBox

0

理由は、抽出は貪欲だったということですので、ssnew >> bValidは「001」までの丸飲み。

strstreamはstringstreamのために推奨されていません。

関連する問題