当我有:
std::ostringstream oss("Hello");
为什么这样做:
std::cout << oss.str();
但这并没有打印任何东西:
std::cout << oss.rdbuf();
阅读operator<<(std::ostream&, std::streambuf*)
的定义,说它将从缓冲区中打印字符。 oss.rdbuf()
不包含任何内容吗?
答案 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();