我們知道,open() 函數第二個引數是一個字串,用於指定檔案的開啟方式,如果該字串中出現 b,則表示以二進位制格式開啟檔案;反之,則以普通的文字格式開啟檔案。
那麼,文字檔案和二進位制檔案有什麼區別呢?
根據我們以往的經驗,文字檔案通常用來儲存肉眼可見的字元,比如 .txt 檔案、.c 檔案、.dat 檔案等,用文字編輯器開啟這些檔案,我們能夠順利看懂檔案的內容。而二進位制檔案通常用來儲存視訊、圖片、音訊等不可閱讀的內容,當用文字編輯器開啟這些檔案,會看到一堆亂碼,根本看不懂。
實際上,從資料儲存的角度上分析,二進位制檔案和文字檔案沒有區別,它們的內容都是以二進位制的形式儲存在磁碟中的。
我們之所以能看懂文字檔案的內容,是因為文字檔案中採用的是 ASCII、UTF-8、GBK 等字元編碼,文字編輯器可以識別出這些編碼格式,並將編碼值轉換成字元展示出來。而對於二進位制檔案,文字編輯器無法識別這些檔案的編碼格式,只能按照字元編碼格式胡亂解析,所以最終看到的是一堆亂碼。
open()的文字格式和二進位制格式
使用 open() 函數以文字格式開啟檔案和以二進位制格式開啟檔案,唯一的區別是對檔案中換行符的處理不同。
在 Windows 系統中,檔案中用 "rn" 作為行末識別符號(即換行符),當以文字格式讀取檔案時,會將 "rn" 轉換成 "n";反之,以文字格式將資料寫入檔案時,會將 "n" 轉換成 "rn"。這種隱式轉換換行符的行為,對用文字格式開啟文字檔案是沒有問題的,但如果用文字格式開啟二進位制檔案,就有可能改變文字中的資料(將 rn 隱式轉換為 n)。
而在 Unix/Linux 系統中,預設的檔案換行符就是 n,因此在 Unix/Linux 系統中文字格式和二進位制格式並無本質的區別。
總的來說,為了保險起見,對於 Windows平台最好用 b 開啟二進位制檔案;對於 Unix/Linux 平台,開啟二進位制檔案,可以用 b,也可以不用。