我一直在阅读并被告知在处理二进制文件时应该使用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 *并执行没有格式化的直接复制,因此是安全的。
这是真的还安全吗?效率怎么样?任何陷阱?细节将不胜感激。
谢谢!
答案 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函数对于二进制数据是安全的。我可以找到的标准中提到的其他“无格式”功能是put
,write
和(正式)flush
。