9

課題のために stringstream を試してみたかったのですが、それがどのように機能するかについて少し混乱しています。簡単に検索しましたが、私の質問に答えるものは見つかりませんでした。

動的なサイズのストリームがあるとします。変数への書き込みを停止するタイミングをどのように知ることができますか?

 string var = "2 ++ asdf 3 * c";
 stringstream ss;

 ss << var;

 while(ss){
  ss >> var;
  cout << var << endl;
 }

私の出力は次のようになります。

2  
++  
asdf  
3  
*  
c  
c  

特に _M_in_cur = 0x1001000d7 ""

4

3 に答える 3

23

c抽出を実行した後、ストリームがまだ良好であるかどうかをテストしないため、最後に余分なものが得られます。

while (ss)        // test if stream is good
{
    ss >> var;    // attempt extraction          <-- the stream state is set here
    cout << var;  // use result of extraction
}

抽出を実行してから結果を使用するまでの間に、ストリームの状態をテストする必要があります。通常、これはループ条件で抽出を実行することによって行われます。

while (ss >> var) // attempt extraction then test if stream is good
{
    cout << var;  // use result of extraction
}
于 2010-09-21T03:23:19.207 に答える
0

コードのwhile(ss)条件チェックは、ストリームからの最後の読み取りが成功したかどうかをチェックします。ただし、このチェックは、文字列の最後の単語を読み取った場合でも true を返します。ss >> varストリームの終わりに到達し、変数 var に抽出するものが何もないため、コード内の次の抽出のみがこの条件を false にします。これが、末尾に余分な 'c' が付く理由です。James McNellis の提案に従ってコードを変更することで、これを排除できます。

于 2010-09-22T16:27:15.630 に答える
-2

ストリームが I/O 操作に使用できるかどうかをテストするメンバー関数 good() もあります。したがって、これを使用して上記のコードを次のように変更できます

while(ss.good())  // check if the stream can be used for io
{
    ss >> var;    // attempt extraction          <-- the stream state is set here
    cout << var;  // use result of extraction
}
于 2010-09-21T06:07:18.547 に答える