轉至:
一、首先回答,什麼是檔案,流
乙個檔案通常就是磁碟上的一段命名的儲存區。比如 stdio.h 就是乙個包含一些有用資訊的檔案的名稱。
c將檔案看成是連續的位元組序列,其中每乙個位元組都可以單獨地讀取。這與 unix 環境(c的發源地)中的檔案結構是一致的。因為其他環境中的檔案模型可能會有所不同,所以 ansi c 提供了檔案的兩種檢視:文字檢視和二進位制檢視。
c將資料的輸入輸出看作是資料的流入和流出,不管是磁碟檔案或者是物理裝置都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一 種流,而不管它的具體結構的方法很有利於程式設計,而涉及流的輸出操作函式可用於各種物件,與其具體的實體無關,即具有通用性。
二、文字檢視和二進位制檢視區別
二進位制檢視中每個位元組都可以為程式所訪問。
在文字檢視中,程式看到的內容和檔案的內容有可能不同(非 unix 環境)。舉例,dos下有個檔案 test.txt,內容為
hello\r\nworld\r\n^z
當以二進位制模式開啟 test.txt 時,c程式看到的內容跟原來一樣(如下),此時,沒有任何對映發生。
hello\r\nworld\r\n
^z
當以文字模式開啟 test.txt 時,c程式看到的是如下內容:(注意行尾和檔案結束符)
hello\nworld\n
也就是說使用文字檢視讀取檔案時,將把行尾的本地環境表示法對映為 c 檢視;在輸出的時候,也會將 c 檢視中的行尾表示對映為本地環境表示法。這樣,c 通過文字檢視巧妙的將不同環境(dos,mac)下的檔案轉換為相同的表示(unix下的表示法)。
而二進位制檢視則與原檔案沒有絲毫變化!有點理解了吧?
三、文字檔案與二進位制檔案
文字檔案是基於字元編碼的檔案,基本是定長的,常見的編碼有ascii編碼,unicode編碼等等。二進位制檔案是基於值編碼的檔案,變長編碼,你可以根據具體應用,指定某個值是什麼意思(這樣乙個過程,可以看作是自定義編碼)。
文字工具開啟乙個檔案的過程是怎樣的呢?拿記事本來說,它首先讀取檔案物理上所對應的二進位制位元流,然後按照你所選擇的解碼方式來解釋這個流,最後將解釋結果顯示出來。當用記事本開啟二進位制檔案時,由於按既定的字元編碼工作(如ascii碼),所以出現亂碼也是很必然的一件事情了。
文字檔案編碼基於字元定長,解碼容易些;二進位制檔案編碼是變長的,所以它靈活,儲存利用率要高些,解碼難一些(不同的二進位制檔案格式,有不同的解碼方式)。 文字檔案的可讀性要好些,儲存要花費轉換時間(讀寫要編譯碼),而二進位制檔案可讀性差(需要具體的檔案解碼器),儲存不存在轉換時間(讀寫不要編譯碼,直接寫值)。
文字流和二進位製流
華清遠見 楊碩 我們在寫 c程式的時候經常會涉及到對流的操作,比如說從標準輸入流讀取一串字串,然後通過標準輸出流輸出顯示在螢幕上,這也就是所謂的 io操作。那麼流究竟是什麼東西?下面首先對流這個概念做一下解釋。一 流 stream 的概念 計算機有很多外部裝置,比如鍵盤 滑鼠 cd rom io操作...
文字流和二進位製流
華清遠見嵌入式學院 講師。我們在寫c程式的時候經常會涉及到對流的操作,比如說從標準輸入流讀取一串字串,然後通過標準輸出流輸出顯示在螢幕上,這也就是所謂的io操作。那麼流究竟是什麼東西?下面首先對流這個概念做一下解釋。一 流 stream 的概念 ansi c進一步對io的概念進行抽象。就c程式而言,...
文字流和二進位製流
我們在寫c程式的時候經常會涉及到對流的操作,比如說從標準輸入流讀取一串字串,然後通過標準輸出流輸出顯示在螢幕上,這也就是所謂的io操作。那麼流究竟是什麼東西?下面首先對流這個概念做一下解釋。一 流 stream 的概念 ansi c進一步對io的概念進行抽象。就c程式而言,所有的io操作只是簡單地從...