流和文件
流:
流是數(shù)據(jù)的傳輸方式;C程序處理一個流而不是直接處理文件。你聲明一個FILE *fp ,并把fopen(某個文件)返回的值賦予fp這兩個動作就相當(dāng)于建立了一個水龍頭,
當(dāng)你用getc(fp)之類的輸入函數(shù)讀取文件字符時就相當(dāng)于擰開了水龍頭,每讀取一個字符,這個文件就像水一樣的流動一下,fp所指的地址自然就向后移動了一位。這個過程就像是文件在流動一樣,抽象為“流”的概念,其實(shí)就是一種傳輸方式;按照不同的分類方法,流又可以分為輸入流、輸出流,文本流和二進(jìn)制流等
數(shù)據(jù)流是一組有順序、有起點(diǎn)和終點(diǎn)的字符集合,是對信息的輸入輸出的一種抽象。這就好比有兩個水池,一個水池用來存放信息,另一個水池用來存放程序。在這兩個水池中間有兩個管子,一個管子的水只能從存放信息的池子流向存放程序的池子,而另一個管子的水只能從存放程序的池子流向存放信息的池子。通過管子的水則稱為數(shù)據(jù)流。當(dāng)需要輸入時,存放信息的池子里的水通過管子流向存放程序的池子。當(dāng)需要輸出時,存放程序的池子里的水通過管子流向存放信息的池子。
說明:數(shù)據(jù)流分為輸入流(InputStream)和輸出流(OutputStream)。輸入流只能從中讀取數(shù)據(jù),而不能向其寫入數(shù)據(jù)。輸出流只能向其寫入數(shù)據(jù),而不能從中讀取數(shù)據(jù)。
文件:
"文件"是指一組相關(guān)數(shù)據(jù)的有序集合
文本文件與二進(jìn)制文件在計算機(jī)文件系統(tǒng)中的物理存儲都是二進(jìn)制的,也就是在物理存儲方面沒有區(qū)別都是01碼,這個沒有異議,他們的區(qū)別主要在邏輯存儲上,也就是編碼上。
文本文件格式存儲時是將值作為字符然后存入其字符編碼的二進(jìn)制,文本文件用‘字符’作為單位來表示和存儲數(shù)據(jù),比如對于1這個值,文本文件會將其看做字符‘1’然后保存其ASCII編碼值(這里假定是ASCII編碼),這樣在物理上就是0x31這個二進(jìn)制值,而若是二進(jìn)制保存1,則直接保存其二進(jìn)制值,比如如果程序中是處理1為整數(shù)則保存的二進(jìn)制值就是 0x00000001 (4字節(jié))。
當(dāng)然如果程序本來就是按字符保存的 也就是 char ch ='1' ;?? ?則二進(jìn)制保存后值就是其ASCII碼,因為該變量的二進(jìn)制本來就是其ASCII碼。可以總結(jié)出二進(jìn)制文件就是值本身的編碼,那么就是不定長的編碼了,因為值本身就是不等字節(jié)的,如整數(shù)4個字節(jié)那么保存在二進(jìn)制文件就是這四個字節(jié)的原生二進(jìn)制值。
綜上,可以知道文本文件與二進(jìn)制文件就是編碼方式不一樣而已,而這個是用戶行為,把一個數(shù)據(jù)以什么樣的編碼(字符還是值本身)存入文件是由用戶主動選擇的,也就是寫入的接口選擇,如果以二進(jìn)制接口方式寫入文件那么就是一個二進(jìn)制文件,如果以字符方式寫入文件就是一個文本文件了。既然有寫入時候的編碼也就會有讀出的編碼,只有兩個編碼對應(yīng)才能讀出正確的結(jié)果,如用記事本打開一個二進(jìn)制文件會呈現(xiàn)亂碼的,這里稍微提一下后綴名,后綴名并不能確定其是否就是文本文件,二進(jìn)制文件也可以是txt后綴名,后綴名只是用來關(guān)聯(lián)打開程序,給用戶做備注用的,與文件的具體編碼沒有關(guān)系。
可以使用字符接口讀寫二進(jìn)制文件,只需要做些處理即可,所以所謂的二進(jìn)制文件,文本文件主要體現(xiàn)在讀寫方式這里。
此外windows有一個明顯的區(qū)別是對待文本文件讀寫的時候,會將換行 \n自動替換成 \r\n。
計算機(jī)的存儲在物理上是二進(jìn)制的,所以文本文件與二進(jìn)制文件的區(qū)別并不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異。
簡單來說,文本文件是基于字符編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼等等。二進(jìn)制文件是基于值編碼的文件,你可以根據(jù)具體應(yīng)用,指定某個值(可以看作是自定義編碼)。
從上面可以看出文本文件基本上是定長編碼的(也有非定長的編碼如UTF-8),基于字符,每個字符在具體編碼中是固定的,ASCII碼是8個比特的編碼,UNICODE一般占16個比特。而二進(jìn)制文件可看成是變長編碼的,因為是值編碼,多少個比特代表一個值,完全由自己決定。
存取
文本工具打開一個文件,首先讀取文件物理上所對應(yīng)的二進(jìn)制比特流,然后按照所選擇的解碼方式來解釋這個流,然后將解釋結(jié)果顯示出來。一般來說,你選取的解碼方式會是ASCII碼形式(ASCII碼的一個字符是8個比特),接下來,它8個比特8個比特地來解釋這個文件流。記事本無論打開什么文件都按既定的字符編碼工作(如ASCII碼),所以當(dāng)他打開二進(jìn)制文件時,出現(xiàn)亂碼也是很必然的一件事情了,解碼和譯碼不對應(yīng)。
文本文件的存儲與其讀取基本上是個逆過程。而二進(jìn)制文件的存取與文本文件的存取差不多,只是編/解碼方式不同而已。
優(yōu)缺點(diǎn)
因為文本文件與二進(jìn)制文件的區(qū)別僅僅是編碼上不同,所以他們的優(yōu)缺點(diǎn)就是編碼的優(yōu)缺點(diǎn)。一般認(rèn)為,文本文件編碼基于字符定長,譯碼容易;二進(jìn)制文件編碼是變長的,所以它靈活,存儲利用率要高些,譯碼難一些(不同的二進(jìn)制文件格式,有不同的譯碼方式)。
轉(zhuǎn)載于:https://www.cnblogs.com/wfwenchao/p/4881979.html
總結(jié)
- 上一篇: Mac安装软件报“打不开。。。,因为它来
- 下一篇: [转]进程间通信 - ipcrm