2009-08-14 35 views
10

我一直阅读和被告知,与二进制文件处理时应该使用read()和write(),而不是在< <和> >运营商,因为它们意味着运营商用于格式化数据。我也读过可以使用它们,但这是一个高级话题,我无法找到任何人潜入和讨论的地方。C++的fstream << and >>二进制数据

我最近看到一些代码,做了以下内容:

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

file1 << file2.rdbuf(); 

当我指出使用< <运营商与二进制文件,我被告知,rdbuf()调用返回一个流缓冲*并且< <重载了streambuf *并且做了一个没有格式化的直接拷贝,因此是安全的。

这是真的,也是安全的吗?效率如何?任何陷阱?详情将不胜感激。

谢谢!

回答

4

是(请参阅27.6.2.5.3/6,其中描述了streambuf的过载< <)。

+3

这是标准页面还是什么? :)一个链接会很好! – Skurmedel 2009-08-14 15:06:03

+0

这是对标准中段落的引用。标准本身不公开。一些草案是,但我没有一个链接手。 – AProgrammer 2009-08-14 15:12:08

+0

好的,谢谢澄清。他们应该使标准公开。 – Skurmedel 2009-08-14 15:13:47

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(); 
+0

这非常整齐。 – Skurmedel 2009-08-14 15:06:42

+0

你有详细的说明为什么这是安全的吗?我知道你可以做到这一点,它似乎工作,但我的好奇心在于,这是一个常见的事情,看看哪些引用声明<< and >>不是二进制数据。例如,这是否适用于以二进制打开的文本文件以及与图像打开相同的文本文件? – 2009-08-14 15:21:58

+0

<< and >>是重载操作符。也就是说,有很多实现。通常,这些用于文本,并将格式化它们的第二个操作数。但是,streambuf超载与其他所有超负荷根本不同。 – MSalters 2009-08-17 07:44:51

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