2009-04-07 114 views
5

我有这样的代码,为什么stringstreams rdbuf()和str()给我不同的输出?

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挖

ss.rdbuf():HEJ med dig

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

回答

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

返回所有缓冲区内容的复制。

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

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

查看描述它从缓冲区中读取字符为单位,并把它们写到ostream的,写作/异常发生,直到EOF /失败。

您已经从buff中读取了一个单词。现在它读取休息部分。

3

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

如果你没有在这里得到满意的答复,请尝试新闻组:

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

+0

哦。我从来没有对这本书的头!听起来像是一本好书,因为我觉得我有点像C++流的复杂性。 – mslot 2009-04-07 22:40:14

+0

这本好书 - 如果你对溪流感兴趣。坦率地说,很少有C++程序员(包括我在内)。 – 2009-04-07 22:43:07

相关问题