2009-08-14 37 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