12

我一直阅读并被告知,在处理二进制文件时,应该使用 read() 和 write() 而不是 << 和 >> 运算符,因为它们用于格式化数据。我还读到可以使用它们,但这是一个高级主题,我找不到任何人深入探讨和讨论的地方。

我最近看到了一些执行以下操作的代码:

std::ifstream file1("x", ios_base::in | ios_base::binary);
 std::ofstream file2("y", ios_base::app | ios_base::binary);

 文件 1 << 文件 2.rdbuf();

当我指出在二进制文件中使用 << 运算符时,有人告诉我 rdbuf() 调用返回一个 streambuf * 并且 << 重载了 streambuf* 并进行了不带格式的直接复制,因此是安全的。

这是真的而且安全吗?效率如何?有什么陷阱吗?细节将不胜感激。

谢谢!

4

3 回答 3

4

是(参见 27.6.2.5.3/6,其中描述了 << 用于 streambuf 的重载)。

于 2009-08-14T14:56:55.060 回答
3

复制流是完全安全且合理的方式。

请注意,它还允许以下内容:

std::ifstream file_in1("x1", ios_base::in | ios_base::binary);
std::ifstream file_in2("x2", ios_base::in | ios_base::binary);
std::ofstream file_out("y", ios_base::app | ios_base::binary);

file_out << file_in1.rdbuf() << "\nand\n" << file_in2.rdbuf();
于 2009-08-14T14:59:37.833 回答
1

在 C++ 标准的第 27.7.3.6.3 节中,提到 第 27.7.3.7 节描述了基本上是二进制副本的“未格式化输入”。这意味着“未格式化”的 ostream 函数对于二进制数据是安全的。我可以找到的标准中提到的其他“未格式化”函数是,和(官方)。
basic_ostream<charT,traits>& operator<< (basic_streambuf<charT,traits>* sb);
Effects: Behaves as an unformatted output function (as described in 27.7.3.7, paragraph 1).

putwriteflush

于 2011-09-21T15:40:49.443 回答