計算機文件分為兩類:文本文件和二進制文件。
一、相關定義
大家都知道計算機的存儲在物理上是二進制的,所以文本文件與二進制文件的區別並不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異。簡單來說,文本文件是基於字符編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼等等。二進制文件是基於值編碼的文件,你可以根據具體應用,指定某個值是什么意思(這樣一個過程,可以看作是自定義編碼。
從上面可以看出文本文件基本上是定長編碼的(也有非定長的編碼如UTF-8)。而二進制文件可看成是變長編碼的,因為是值編碼嘛,多少個比特代表一個值,完全由你決定。大家可能對BMP文件比較熟悉,就拿它舉例子吧,其頭部是較為固定長度的文件頭信息,前2字節用來記錄文件為BMP格式,接下來的8個字節用來記錄文件長度,再接下來的4字節用來記錄bmp文件頭的長度。
二、兩者的區別
要弄明白二者的區別,需要知道文件的讀寫過程。
讀文件:實際上是“磁盤→文件緩沖區→應用程序內存空間”這兩個轉化過程!
我們說“文本文件和二進制文件沒有區別”,實際上針對的是第一個過程;既然沒有區別,那么打開方式不同,為何顯示內容就不同呢?這個區別實際上是第二個過程造成的。
文件實際上包括兩部分,控制信息和內容信息。純文本文件僅僅是沒有控制格式信息罷了;實際上也是一種特殊的二進制文件。所以,我們很難區分二者的不同,因為他們的概念上不是完全互斥的。
我們說文本文件是特殊的二進制文件,是因為文本文件實際上的解釋格式已經確定了:ASCII或者unicode編碼。文本文件的一個缺點是,它的熵往往較低,也就是說,其實本可以用更小的存儲空間記錄這些信息。比如,文本文件中的一個數字65536,需要用5個字節來存儲;但是用二進制格式,采用int存儲,僅僅需要2個字節。而二進制文件elf和bmp等,都往往有一個head,告訴你文件信息和解釋方式。
至於“文本文件可以按行操作,即一行一行的操作,而二進制就只能按字節塊了”,這個說法則是完全錯誤的。- 二進制文件是把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤上存放,也就是說存放的是數據的原形式。
- 文本文件是把數據的終端形式的二進制數據輸出到磁盤上存放,也就是說存放的是數據的終端形式。
我們有必要把需要存儲的數據分為字符數據和非字符數據兩類。當你有數據要存儲的時候.首先要考慮的問題並不是你要選擇用二進制文件還是文本文件來進行存儲,而是首先得考慮你要存儲的數據是字符數據還是非字符數據.在此基礎上再討論應該選擇用什么文件進行存儲為好。
(1)如果要存儲字符數據,無論是放在文本文件還是放在二進制文件中都和內存中的數據形式是沒有區別的.同樣也和終端形式沒有區別。那么在存儲和顯示的特性上也沒有任何區別,不浪費存儲空間也不浪費轉換時間。所以如果一個文件只存放字符數據,那么討論該文件是用文本文件或是二進制文件是沒有任何意義的。
(2)如果要存儲非字符數據,則情況要復雜一些。
- 如果您需要頻繁地保存和訪問數據.那么應該采用二進制文件進行存放,這樣可以節省存儲空間和轉換時間。
- 如果您需要頻繁地向終端顯示數據或從終端讀人數據,那么應該采用文本文件進行存放,這樣可以節省轉換時間。
(3)如果要存儲的數據中既有字符數據又有非字符數據那么要怎么辦呢?那就要綜合上述兩點進行權衡以找到最佳平衡點了
總結:字符數據本身在內存中就經過了編碼,所以無論是二進制還是文本形式都是一樣的,而對於非字符數據來說,例如inti=10;如果用二進制來進行存儲的話為1010,但是如果需要用文本形式來進行存儲的話就必須進行格式化編碼(對1和0分別編碼,即形式為‘1’和‘0’分別對應的碼值)。
