檔案的文字開啟方式和二進位制開啟方式有什麼區別?

2020-07-16 10:05:21
在學習了 C++ 檔案流物件使用 open() 開啟檔案後,我們知道它的第二個引數是一個字串,用來表示檔案開啟方式,即如果使用 ios::binary,則表示以二進位制方式開啟檔案;反之,則以文字檔案的方式開啟檔案。

文字檔案和二進位制檔案的區別

根據我們以往的經驗,文字檔案通常用來儲存肉眼可見的字元,比如 .txt檔案、.c檔案、.dat檔案等,用文字編輯器開啟這些檔案,我們能夠順利看懂檔案的內容。

二進位制檔案通常用來儲存視訊、圖片、程式等不可閱讀的內容,用文字編輯器開啟這些檔案,會看到一堆亂碼,根本看不懂。

但是從物理上講,二進位制檔案和字元檔案並沒有什麼區別,它們都是以二進位制的形式儲存在磁碟上的資料。

我們之所以能看懂文字檔案的內容,是因為文字檔案中採用的是 ASCII、UTF-8、GBK 等字元編碼,文字編輯器可以識別出這些編碼格式,並將編碼值轉換成字元展示出來。

而二進位制檔案使用的是 mp4、gif、exe 等特殊編碼格式,文字編輯器並不認識這些編碼格式,只能按照字元編碼格式胡亂解析,所以就成了一堆亂七八糟的字元,有的甚至都沒見過。

如果我們新建一個 mp4 檔案,給它寫入一串字元,然後再用文字編輯器開啟,你一樣可以讀得懂,有興趣的讀者可以自己試試。

總的來說,不同型別的檔案有不同的編碼格式,必須使用對應的程式(軟體)才能正確解析,否則就是一堆亂碼,或者無法使用。

兩種開啟方式的區別

文字方式和二進位制方式並沒有本質上的區別,只是對於換行符的處理不同。

在 UNIX/Linux 平台中,用文字方式或二進位制方式開啟檔案沒有任何區別,因為文字檔案以 n(ASCII 碼為 0x0a)作為換行符號。

但在 Windows 平台上,文字檔案以連在一起的 rn 作為換行符號。如果以文字方式開啟檔案,當讀取檔案時,程式會將檔案中所有的 rn 轉換成一個字元 n。也就是說,如果文字檔案中有連續的兩個字元是 rn,則程式會丟棄前面的 r,唯讀入 n。

同樣當寫入檔案時,程式會將 n 轉換成 rn 寫入。也就是說,如果要寫入的內容中有字元 n,則在寫入該字元前,程式會自動先寫入一個 r。

因此在 Windows 平台上,如果用文字方式開啟二進位制檔案進行讀寫,讀寫的內容就可能和檔案的內容有出入。

總的來說,Linux 平台使用哪種開啟方式都行;Windows 平台上最好用 "ios::in | ios::out" 等開啟文字檔案,用 "ios::binary" 開啟二進位制檔案。但無論哪種平台,用二進位制方式開啟檔案總是最保險的。