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