1. 程式人生 > 其它 >C語言中文字檔案與二進位制檔案的區別

C語言中文字檔案與二進位制檔案的區別

在學習C語言fopen()函式後,知道它的第二個引數是標誌字串。如果字串中出現'b',則表明是以開啟二進位制(binary)檔案,否則是開啟文字檔案。

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

檔案可以分為兩類:二進位制檔案和字元(文字)檔案。從物理上講二進位制檔案和字元檔案沒有區別,都是以二進位制的形式儲存在磁碟上。但是它們在檔案的組織形式上不一樣,二進位制檔案有檔案頭(File Header),用以表明檔案的大小、型別等資訊,程式在處理二進位制檔案時一般會先分析檔案頭,判斷檔案是否合法,也就是說,檔案頭後面的資料才是程式真正要處理的;字元檔案沒有檔案頭,第一個位元組就是要顯示的內容。

拿 BMP 檔案舉例,其頭部的長度較為固定,前2位元組用來記錄檔案為BMP格式,接下來的8個位元組用來記錄檔案長度,再接下來的4位元組用來記錄 BMP 檔案頭的長度。

文字檔案是基於字元編碼的,常見的編碼方式有 ASCII、UNICODE、UTF-8 等;指定編碼方式後,每個位元組(也可以是每兩個、三個位元組)所表示的字元是一樣的,任何程式都可以正確讀取。

二進位制檔案是自定義編碼的,也就是說,你可以根據具體程式指定每個位元組(或者每兩個、三個位元組)代表什麼意思。例如,A 程式是影象編輯器,指定 01001111 代表紅色,B 程式是視訊播放器,它把 01001111 理解為快進,顯然是不對的。

所以,字元檔案是通用的,任何程式只要按照對應的編碼方式開啟都可以正確顯示,二進位制檔案只有特定的程式才能處理。

文字檔案和二進位制檔案都可以在螢幕上顯示,但是二進位制檔案的內容無法讀懂,大部分是亂碼。

fopen中的文字檔案和二進位制檔案

在C語言中,二進位制方式很簡單,讀檔案時,會原封不動的讀出檔案的全部內容,寫的時候,也是把記憶體緩衝區的內容原封不動的寫到檔案中。

而對文字檔案的處理就不一樣了。Windows 和 DOS 下的文字檔案以CRLF(0X0D 0X0A)作為換行符,而C語言本身以LF(0X0A)作為換行符,所以以文字方式寫入資料時,會將LF(0X0A)替換為CRLF(0X0D 0X0A),而讀取資料時又會替換回來。

CR(0X0D)表示回車符,也就是 '\r';CL(0X0A)表示換行符,也就是 '\n'。

在Linux和其他一些系統中,文字檔案的換行符就是LF(0X0A),與C語言的換行符一樣。所以也就沒有了文字方式和二進位制方式的區分,使不使用'b'標誌都是一樣的。

這是由於不同作業系統對文字檔案換行符的定義,和C語言中換行符的定義有所不同而造成的。在Windows下,C語言的輸入輸出函式會自動進行 CRLF 和 LF 的轉換,而Linux等就不必了。

另外,以文字方式開啟時,遇到結束符CTRLZ(0x1A)就認為檔案已經結束。所以,若使用文字方式開啟二進位制檔案,就很容易出現檔案讀不完整,或內容不對的錯誤。即使是用文字方式開啟文字檔案,也要謹慎使用,比如複製檔案,就不應該使用文字方式。

綜上所述:二進位制和文字模式的區別就在於對換行符和一些非可見字元的轉化上,如非必要,是使用二進位制讀取會比較安全一些。