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

tem*_*boy 5 c++

当我有:

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()没有包含什么吗?

4pi*_*ie0 4

这个问题与这里的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)