2016-01-06 56 views
2

在二進制模式下使用格式化的IO操作有什麼問題,特別是如果我只處理文本文件?在二進制模式下使用格式化的IO操作?

(1)

對於二進制文件,閱讀和與提取和插入運算符(< <和>>)和函數寫數據,如函數getline是沒有效率的,因爲我們並不需要格式化的任何數據並且數據可能不會按行格式化。

(2)

通常情況下,二進制文件I/O不使用傳統的面向文本的< <和>>運算!它可以完成,但這是一個高級話題。

「高級話題」的本質是讓我質疑這兩者的混合。有一個mingw bug與查找和告訴功能可以解決打開二進制模式。使用< <和>>在二進制模式下與文本模式相比是否存在任何問題,或者如果打開二進制文件,我是否必須始終使用未格式化的IO? As far as I can tell for text files,我只需要考慮回車符(\ r),這些回車符不會被隱式刪除/添加給我,但是所有這些都是要考慮的嗎?

+0

文件的*二進制模式*表示在讀取或寫入文件('ios :: binary')時不會發生翻譯。一種常見的翻譯是行結尾。這與使用'istream :: read'和'ostream :: write'直接讀取和寫入未格式化的數據不同。 –

回答

0

在二進制 模式下使用格式化的IO操作有什麼問題,特別是如果我只處理文本文件?

我只是必須考慮回車符號(\ r)不是 implictly刪除/添加我

如果你想要或需要在您的數據\r,你可能處理文本/字符串。爲此你不需要使用二進制文件。儘管可以用二進制模式打開文本文件,以便快速掃描換行符(行數),而不必執行效率較低的readline()

二進制文件用於直接存儲二進制值(主要是數字或數據結構),無需將它們轉換爲文本並再次轉換回二進制文件。

二進制文件的另一個優點是你不必做任何解析。您可以直接訪問所有數據,無論文件在哪裏(假設數據以良好結構存儲)。例如:如果您需要存儲記錄,每個記錄包含5個32位數字,則可以將這些記錄直接寫入二進制文件,以其原始二進制格式(不會浪費時間進行轉換和解析)。例如,稍後要讀取記錄nr 1000,您可以直接將seek定位到5 x 4 x(1000-1)的位置,然後從那裏讀取您的20字節記錄。另一方面,使用文本文件時,您需要掃描文件開始處的每個字節,直到您計算了1000行(也將具有不同的長度)。

你會使用read()write()(或fread()/fwrite())直接(雖然<<>>可以太用於具有可變長度的對象serialization)。

二進制文件還應該有一個包含一些基本信息的標題。有關更多信息,請參閱my answer here

+0

_「二進制文件還應該有一個包含一些基本信息的標頭。」_在某些子集的情況下。說這是一個普遍的規則充其量是樂觀的。 –