【问题标题】:Why is stringstreams rdbuf() and str() giving me different output?为什么 stringstreams rdbuf() 和 str() 给我不同的输出?
【发布时间】:2010-10-18 04:24:27
【问题描述】:

我有这个代码,

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

【问题讨论】:

    标签: c++ std stringstream getline sstream


    【解决方案1】:
    ss.rdbuf()->str();
    

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

    std::cout &lt;&lt; ss.rdbuf(); 在做什么?

    查看说明

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

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

    你已经读过buff的一个词。现在它读取了其余部分。

    【讨论】:

    • 哦。我没有在我的一本昂贵的 C++ 书籍中查找它的事实是我正在度假,所以我只有谷歌,我找不到以我理解的方式解释 operator
    • 我没有使用一本昂贵的 C++ 书籍。我只是明白这种行为不是 rbuf() 指定的,并开始在这个重载运算符的标准中查找
    • 从读取字符串缓冲区中删除字符是缓慢的操作 - 显然不使用。感谢您的兴趣任务:)
    • bb,看标准:)我家里有这样的标准。我正在度假,没有随身携带。我已经阅读了 iostream 运算符的声明,但这并没有告诉我它是如何工作的。我想我在谷歌迷路了。但是感谢您的链接!
    【解决方案2】:

    引用 C++ 流 I/O 上的圣经,Langer and Kreft,在流缓冲区上调用 str()(即 rdbuf() 返回的东西)“以极其违反直觉的方式表现”(我的第 72 页)版)。要了解完整的故事,您必须阅读这本书。

    如果你在这里没有得到满意的答案,试试usenet群:

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

    【讨论】:

    • 哦。我从来没有想过那本书!听起来是一本好书,因为我觉得我有点喜欢 C++ 流的复杂性。
    • 这是一本好书——如果你对流感兴趣的话。坦率地说,很少有 C++ 程序员(包括我在内)。
    • 但是在我的例子中,rdbuf() 和 rdbuf()->str() 不应该返回相同的东西,因为 getline 的第一个参数是引用调用?
    • 如果我们当然从理论上思考,并远离 streambuf“以极其违反直觉的方式行事”的事实。
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 2017-11-21
    • 2017-12-13
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多