在 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();
对我来说它没有输出任何东西。
是否将 ofstream
的 filebuf*
传递给 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。
祝你好运。
使用 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();
对我来说它没有输出任何东西。
是否将 ofstream
的 filebuf*
传递给 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。
祝你好运。