在 C++ 中输出 ofstream 的 filebuf* 有什么作用?

What does outputting the filebuf* of an ofstream in C++ do?

使用 ifstream 我们可以像这样将整个文件输出到 cout

std::ifstream foo("testfile");
std::cout << foo.rdbuf();

但是当我们尝试对 ofstream 做同样的事情时会发生什么?

std::ofstream foo("testfile", std::ios::app); // use app to avoid wiping out contents of testfile
std::cout << foo.rdbuf();

对我来说它没有输出任何东西。

是否将 ofstreamfilebuf* 传递给 std::cout::operator<< 只是一种没有实际用途的无用可能性?还是有什么我不知道的?

当为 streambuf 插入作为无格式数据执行 operator << 重载时,流缓冲区被拉取直到它到达 eof,但是没有什么可以开始的,所以...

结果是将写入零个字符。根据标准 (C++14 § 27.7.3.6.3/9),在这种情况下,它在目标输出流上设置了失败位,并通过以下方式证明:

#include <iostream>
#include <fstream>
#include <iomanip>

int main()
{
    std::ofstream foo("testfile", std::ios::app);
    std::cerr << std::boolalpha << std::cout.fail() << '\n';
    std::cout << foo.rdbuf();
    std::cerr << std::boolalpha << std::cout.fail() << '\n';
}

输出

false
true

是的,在这种情况下,它不仅无用,而且使目标 ostream 无用,直到其失败状态为 clear()ed。

祝你好运。