9

我想尝试使用 stringstream 进行分配,但我对它的工作原理有点困惑。我进行了快速搜索,但找不到任何可以回答我问题的东西。

假设我有一个动态大小的流,我怎么知道何时停止写入变量?

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

 ss << var;

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

我的输出是:

2  
++  
asdf  
3  
*  
c  
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 中,因此只有代码中的下一次提取才会使此条件为假。这就是你最后得到一个额外的“c”的原因。您可以按照 James McNellis 的建议更改代码来消除这种情况。

于 2010-09-22T16:27:15.630 回答
-2

还有一个成员函数 good() 用于测试流是否可用于 I/O 操作。所以使用这个上面的代码可以改成

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 回答