2017-01-13 50 views
0

我想了解C++中stringstream的细节。但是当我尝试重新输入stringstream对象时(“< <”),我发现了一个麻烦。 (即obj的内容仍然保持不变)。我的代码如下。输出显示在评论中。C++:为什么重新输入stringstream不起作用?内容保持不变

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    stringstream sso; 
    cout <<"orginal: " << sso.str() <<endl; //orginal:"empty" 
    sso << "A" << " " << "B" << " " << "C"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:A B C 

    string r1, r2, r3; 
    sso >> r1 >> r2 >> r3; 
    cout << "flowout:" << r1 << r2 << r3 << endl;//flowout:ABC 
    cout << "base: " << sso.str() << endl; //base: A B C 

    cout << "----problem here-----" << endl; 
    sso << "D" << " " << "E" << " " << "F"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:A B C 

    cout << "----this works-----" << endl; 
    sso.clear(); //clear flag 
    sso.str(""); //clear content 
    sso << "D" << " " << "E" << " " << "F"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:D E F 

    return 0; 
} 

为什么?我不明白“---这里---问题---”的结果。为什么sso不接受新的输入?

Apprecited,

回答

0

sso >> r1 >> r2 >> r3;最后读取的将流进,因为没有更多的字符是可用的,同时它仍在努力为r3更多字符失效状态。

在失败状态下,流无法写入或读取。要解决您的问题,请将sso.clear();移至sso << "D"之前。

如果您在C之后输出额外空间,您可以看到不同的行为,因为流未进入失败状态(它在流中仍存在空间时成功读取r3)。

+0

非常感谢。 :) –