一、文本文件和二進制文件的定義
計算機上所有文件存儲在存儲設備上都是二進制的, 所以文本文件和二進制文件的區別並不是物理上的, 而是邏輯上的!簡單來說, 文本文件是基於字符編碼的文件, 常見的編碼有ASCII編碼和UNICODE編碼等, 二進制是基於值編碼的文件, 可以根據具體應用指定某個值是什么意思.
從以上可以看出文本文件基本上是定長編碼的, 基於字符, 每個字符在具體編碼中所占位數是固定的, 比如ASCII是8個比特的編碼, UNICODE一般占16個比特.而二進制文件可以看成是變長編碼的, 因為是值編碼, 多少個比特代表一個值完全由你決定, 大家對BMP文件比較熟悉, 就拿它舉例子吧, 其頭部是固定長度的14字節的文件頭, 然后是40個字節的位圖信息頭.大家可以看出來了吧, 其編碼是基於值的(不定長的, 2、4、8字節長的值都有), 所以BMP是二進制文件.
二、文本文件和二進制文件的存取
用文本工具打開文件的過程如下, 拿記事本來說, 首先讀取文件屋里上所對應的的二進制比特流(在實際存儲中為二進制的), 然后按照你的解碼方式來解釋這個流, 將結果顯示出來.比如你所選解碼方式為ASCII(每個字符8比特), 接下來, 8個比特8個比特的去解釋這個文件流, 例如"01000000_01000001_10000010_01000011"(下划線是為增加可讀性而加, 實際中沒有), 第一個8比特"01000000"按ASCII碼來解碼的話對應字符"A", 同理其他3個8比特分別解碼為"BCD", 即這個文件流可以解釋為"ABCD", 然后記事本就將這個"ABCD"顯示在屏幕上.
但是用記事本打開二進制文件, 會用既定的字符編碼工作(如ASCII碼), 所以當它打開二進制文件時, 出現亂碼是很必然了!解碼和譯碼不對嘛!比如文件流"00000000_00000000_00000000_00000001"可能在二進制文件中對應的是一個四字節的整數int 1, 在記事本里解釋就變成了"NULL_NULL_NULL_SOH"這四個控制字符
也就是不管二進制文件還是文本文件, 在存儲時都是一連串的0和1, 但是打開方式不同, 這些0和1的處理就不同, 如果按文本方式打開, 打開的時候就會進行translate, 將每個字節轉換成對應編碼(ASCII、UNICODE等), 而以二進制方式打開的話則不會進行任何translate, 在編輯的時候文本最小單位為字節, 而二進制文件最小單位則是位!
三、文本文件和二進制文件的優缺點
文本文件編碼基於字符定長, 譯碼容易
二進制文件編碼變長, 所以靈活, 存儲利用率要高, 譯碼難
四、C語言中文本讀寫和二進制讀寫
在WINDOWS操作系統上, C語言的文本讀寫和二進制讀寫的差別僅僅體現在回車換行符的處理上
文本方式寫時, 每遇到一個"\n"(0AH換行符), 它將其轉換成"\r\n"(0D0AH, 回車換行), 然后再寫入文件, 當文本文件讀取時, 它遇到一個"\r\n"將其反轉換成"\n", 然后送到讀緩沖區
二進制讀寫時不存在任何轉換, 直接將寫緩沖區中數據寫入文件
總的來說, 從編程角度來說, C語言中文本或二進制讀寫都是緩沖區與文件中二進制流的交互, 只是文本讀寫時有translate和回車換行的轉換, 所以當寫緩沖區中無換行符時文本寫和二進制寫的結果是一樣的, 同理, 當文件中不存在換行符時, 文本讀和二進制讀的結果一樣
