当我有:
std::ostringstream oss("Hello");
Run Code Online (Sandbox Code Playgroud)
为什么这样做:
std::cout << oss.str();
Run Code Online (Sandbox Code Playgroud)
但这不会打印任何内容:
std::cout << oss.rdbuf();
Run Code Online (Sandbox Code Playgroud)
阅读定义operator<<(std::ostream&, std::streambuf*)说它将从缓冲区打印字符。难道oss.rdbuf()没有包含什么吗?
这个问题与这里的ostringstream对象(ostringstreamoss是输出流,因此它的目的地是写入它而不是从中读取)以及流如何管理其内部缓冲区这一事实有关。
你可以改变
std::ostringstream oss("Hello");
Run Code Online (Sandbox Code Playgroud)
到
std::istringstream oss("Hello"); // or std::stringstream oss("Hello");
Run Code Online (Sandbox Code Playgroud)
它会按预期工作。或者使用
std::cout << oss.rdbuf()->str(); // this will print a copy of all buffer content
Run Code Online (Sandbox Code Playgroud)
例子:
#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;
}
Run Code Online (Sandbox Code Playgroud)