为什么stringstreams rdbuf()和str()给我不同的输出?

时间:2009-04-07 21:51:12

标签: c++ std stringstream getline sstream

我有这段代码,

int main()
{
    std::string st;
    std::stringstream ss;
    ss<<"hej hej med dig"<<std::endl;

    std::getline(ss,st,' ');
    std::cout <<"ss.rdbuf()->str() : " << ss.rdbuf()->str();
    std::cout <<"ss.rdbuf() : " << ss.rdbuf();
    return 0;
}

给我这个输出

  

ss.rdbuf() - &gt; str():hej hej med dig

     

ss.rdbuf():hej med dig

但为什么呢?是因为运算符&lt; str()的ostreams定义给了我不同的输出。在我看来,即使我使用了getline,输出应该是相同的。

2 个答案:

答案 0 :(得分:7)

ss.rdbuf()->str();

返回所有缓冲区内容的副本。

做什么std::cout << ss.rdbuf();

参见

的说明
basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb);

它从缓冲区逐个字符读取并将它们写入ostream,直到写入/异常发生eof / fail。

你已经从buff读过一个单词。现在它读了休息部分。

答案 1 :(得分:2)

引用C ++流I / O上的圣经Langer and Kreft,在流缓冲区上调用str()(即rdbuf()返回的东西)“以非常违反直觉的方式行事”(第72页)在我的版本中)。完整的故事,你将不得不阅读这本书。

如果您在这里没有得到满意的答案,请尝试使用usenet组:

http://groups.google.com/group/comp.lang.c++.moderated