2011-09-18 112 views

回答

5

從上ifstream類的構造文檔:

二進制(二進制)考慮流作爲二進制而不是文本。
in(輸入)允許在流上進行輸入操作。

所以從文件中讀取的時候,我會用std::ifstream::in標誌,不是因爲它是必需的(或沒有),而是因爲這將是一個良好的編程習慣,讓編程接口知道你要作什麼用途。

編輯:
以下是從http://www.cplusplus.com/doc/tutorial/files/拍攝,約open()成員函數雖然(但在問題的代碼構造函數可能跟open()複製模式標誌不加修改)。

類:默認模式參數
ofstream的:IOS ::出
ifstream的:IOS ::在
的fstream:IOS ::在| IOS ::出

對於ifstream的和ofstream的類,IOS ::在和IOS ::出自動和分別是 假定,即使不 一個模式包括它們作爲第二個參數到打開傳遞()會員 功能。

儘管如此,Web上的很多示例在顯示ifstream對象的構造時使用ifstream::in。真的可能是某種迷信的做法,而不是編程。

+1

@ Naveen:我需要讓'ifstream'知道我想用它作爲_input_嗎?我可以簡單地使用'fstream' - 這就是爲什麼我首先發布了這個問題。 :) –

+0

是的,好點:P在編輯中我已經變得柔軟了。 –

+1

夥計們,停止upvoting我的答案,因爲它並沒有真正給出太多的答案,只是表達了個人意見加上給'open()'成員函數一些間接相關的信息。但是,這並不意味着我希望它得到downvoted =) –

1

我不能在網上找到權威的文檔。

編輯我什至不能找到一個適當的參考在我的副本Josuttis Book,第8次印刷。 它應該是在第13.9頁627-631

經驗證據表明它是多餘的IFF沒有的std :: IOS的​​::在或std :: IOS:出傳遞:

#include <fstream> 
#include <iostream> 

int main(int argc, char** args) 
{ 
    std::ifstream ifs(args[0], std::ios::binary); 
    std::cout << ifs.rdbuf() << std::flush; 

    return 0; 
} 

成功:

test | md5sum 
md5sum test 

顯示相同的哈希總和。


// ... 
    std::ifstream ifs(args[0], std::ios::out | std::ios::binary); 

將失敗(零字節輸出)

test | wc -c # shows 0 
1

binary,在這種情況下,僅指讀寫方法。在Windows的常規模式下,'\n'被翻譯爲'\r''\n'。這可能會影響讀取和寫入,所以二進制模式會將其關閉。 out|binaryin|binary

相關問題