這幾個(gè)概念很常見但是也容易搞混。前兩者是相反的意思,后兩者是一對(duì)。
1. 文本模式(textmode)和二進(jìn)制模式(binarymode)的區(qū)別
0. 無論你用哪種語(yǔ)言進(jìn)行程序設(shè)計(jì),也無論你用哪個(gè)函數(shù)進(jìn)行文件操作(庫(kù)函數(shù)也好,直接操作系統(tǒng)API也好),最終的文件打開的操作都是由操作系統(tǒng)來進(jìn)行的,因此各種語(yǔ)言的情況從本質(zhì)上來說都是相同的。用二進(jìn)制模式打開一個(gè)文件的時(shí)候,文件本身的內(nèi)容和你編寫程序時(shí)用函數(shù)讀到的內(nèi)容完全相同(或者說和磁盤上的內(nèi)容完全相同)。但是如果用了文本模式,那么操作系統(tǒng)在將文件內(nèi)容傳給上層程序(庫(kù)函數(shù),或者是你的程序)時(shí),或者上層程序通過操作系統(tǒng)向文件寫入內(nèi)容時(shí),操作系統(tǒng)都會(huì)預(yù)先進(jìn)行一層預(yù)處理(或者說轉(zhuǎn)義),具體過程依賴于操作系統(tǒng)的實(shí)現(xiàn)。
1. 在unix(包括linux)系統(tǒng)上,一個(gè)程序從文件里讀數(shù)據(jù),它得到的數(shù)據(jù)就是數(shù)據(jù)本身,一個(gè)一個(gè)的字節(jié)。然而在windows系統(tǒng)上,一個(gè)文件可以 用兩種模式打開,二進(jìn)制模式或者文本模式,在二進(jìn)制模式下,表現(xiàn)的就像unix系統(tǒng);然而在文本模式下,會(huì)有一個(gè)轉(zhuǎn)換。是\n <-------> \r\n之間的轉(zhuǎn)換。具體講就是將回車符"\r\n"解釋成"\n"(讀出時(shí)),將"\n"解釋成"\r\n"(寫入時(shí))??傊?,在unix系統(tǒng)上,打開文件只有二進(jìn)制模式,在windows系統(tǒng)上,打開文件有文本模式和二進(jìn)制模式兩種。
2.文本文件與二進(jìn)制文件的區(qū)別:
將文件看作是由一個(gè)一個(gè)字節(jié)(byte) 組成的, 那么文本文件中的每個(gè)字節(jié)的最高位都是0,也就是說文本文件使用了一個(gè)字節(jié)中的七位來表示所有的信息,而二進(jìn)制文件則是將字節(jié)中的所有位都用上了。這就是兩者的區(qū)別;接著,第二個(gè)問題就是文件按照文本方式或者二進(jìn)制方式打開,兩者會(huì)有什么不同呢?其實(shí)不管是二進(jìn)制文件也好,還是文本文件也好,都是一連串的0和1,但是打開方式不同,對(duì)于這些0和1的處理也就不同。如果按照文本方式打開,在打開的時(shí)候會(huì)進(jìn)行translate,將每個(gè)字節(jié)轉(zhuǎn)換成ASCII碼,而以按照二進(jìn)制方式打開的話,則不會(huì)進(jìn)行任何的translate;最后就是文本文件和二進(jìn)制文件在編輯的時(shí)候,使用的方式也是不同的。譬如,你在記事本中進(jìn)行文本編輯的時(shí)候,你進(jìn)行編輯的最小單位是字節(jié)(byte);而對(duì)二進(jìn)制文件進(jìn)行編輯的話,最小單位則是位(bit),當(dāng)然我們都不會(huì)直接通過手工的方式對(duì)二進(jìn)制文件進(jìn)行編輯了。
從文件編碼的方式來看,文件可分為ASCII碼文件和二進(jìn)制碼文件兩種:
ASCII文件也稱為文本文件,這種文件在磁盤中存放時(shí)每個(gè)字符對(duì)應(yīng)一個(gè)字節(jié),用于存放對(duì)應(yīng)的ASCII碼。例如,數(shù)5678的存儲(chǔ)形式為:
ASCII碼: 00110101 00110110 00110111 00111000
↓ ↓ ↓ ↓
十進(jìn)制碼: 5 6 7 8
共占用4個(gè)字節(jié)。ASCII碼文件可在屏幕上按字符顯示,例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內(nèi)容。由于是按字符顯示,因此能讀懂文件內(nèi)容。
二進(jìn)制文件是按二進(jìn)制的編碼方式來存放文件的。例如,數(shù)5678的存儲(chǔ)形式為:00010110 00101110 只占二個(gè)字節(jié)。二進(jìn)制文件雖然也可在屏幕上顯示,但其內(nèi)容無法讀懂。C系統(tǒng)在處理這些文件時(shí),并不區(qū)分類型,都看成是字符流,按字節(jié)進(jìn)行處理。輸入輸出字符流的開始和結(jié)束只由程序控制而不受物理符號(hào)(如回車符)的控制。因此也把這種文件稱作“流式文件”。