6

我有这个代码,

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()->str() : hej hej med dig

ss.rdbuf() : hej med dig

但这是为什么呢?是不是因为 ostreams 对 operator<str() 的定义给了我不同的输出。在我看来,即使我使用了 getline,输出也应该是相同的。

4

2 回答 2

7
ss.rdbuf()->str();

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

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

见说明

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

它从缓冲区中逐个字符地读取并将它们写入 ostream,直到出现 eof/写入失败/异常。

你已经读过buff的一个字。现在它读到了剩下的部分。

于 2009-04-07T22:54:56.617 回答
1

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

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

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

于 2009-04-07T22:16:17.897 回答