C ++ fstream<<和>>运算符二进制数据

时间:2009-08-14 14:41:04

标签: c++ iostream standard-library

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

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

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

 file1 << file2.rdbuf();

当我指出使用&lt;&lt;运算符与二进制文件,我被告知rdbuf()调用返回streambuf *和&lt;&lt;重载streambuf *并执行没有格式化的直接复制,因此是安全的。

这是真的还安全吗?效率怎么样?任何陷阱?细节将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:4)

是(见27.6.2.5.3 / 6,其中描述了&lt;&lt;对于streambuf的重载)。

答案 1 :(得分: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();

答案 2 :(得分:1)

在C ++标准的第27.7.3.6.3节中,提到了 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).

 §27.7.3.7描述了“无格式输入”,它基本上是一个二进制副本。这意味着“未格式化”的ostream函数对于二进制数据是安全的。我可以找到的标准中提到的其他“无格式”功能是putwrite和(正式)flush