使用str()和rdbuf()打印出字符串流

时间:2014-10-12 21:13:28

标签: c++

当我有:

std::ostringstream oss("Hello");

为什么这样做:

std::cout << oss.str();

但这并没有打印任何东西:

std::cout << oss.rdbuf();

阅读operator<<(std::ostream&, std::streambuf*)的定义,说它将从缓冲区中打印字符。 oss.rdbuf()不包含任何内容吗?

2 个答案:

答案 0 :(得分:3)

此问题与以下事实有关:oss ostringstream 对象( ostringstream 是输出流,因此其目的地是写入它而不是从中读取)以及流如何管理其内部缓冲区。

您可以更改

std::ostringstream oss("Hello");

std::istringstream oss("Hello");  // or std::stringstream oss("Hello");

它将按预期工作。或者使用

std::cout << oss.rdbuf()->str(); // this will print a copy of all buffer content

示例:

#include <iostream>
#include <sstream>

int main() {
    std::ostringstream oss("Hello");
    std::istringstream oss2("Hello");
    cout << oss.rdbuf()->str() << endl;  // prints "Hello"
    cout << oss2.rdbuf();                // prints "Hello"
    return 0;
}

答案 1 :(得分:0)

ostringstream类的对象使用包含一系列字符的字符串缓冲区。这个字符序列可以使用成员str直接作为字符串对象访问。这解释了第一部分。

std::ostringstream oss("Hello");
std::cout << oss.str(); // works

rdbuf返回指向相关streambuf对象的指针,该对象负责所有输入/输出操作。因此,您需要再次使用str()来打印内容,如下所示:

std::cout << oss.rdbuf()->str();

而不是:

std::cout << oss.rdbuf();