如何读取动态大小的stringstream?

时间:2010-09-21 03:19:12

标签: c++ stringstream

我想尝试使用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“”

3 个答案:

答案 0 :(得分:20)

你最后得到额外的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
}

答案 1 :(得分:0)

代码中的while(ss)条件检查检查流中的最后一次读取是否成功。但是,即使您已读取字符串中的最后一个单词,此检查也将返回true。只有代码中的ss >> var的下一次提取才会使此条件成为错误,因为已达到流的末尾&amp;没有什么可以提取到变量var中。这就是你最后获得额外'c'的原因。您可以通过更改James McNellis建议的代码来消除此问题。

答案 2 :(得分:-1)

还有一个成员函数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
}