C語言中的文字流與二進位製流的區別

2021-09-08 02:17:27 字數 1489 閱讀 7140

近期看到了文字流和二進位製流的區別,書上講的比較含糊,理解不透徹,於是細細琢磨了下,把心得跟大家分享一下:

一、首先回答,什麼是檔案,流

乙個檔案通常就是磁碟上的一段命名的儲存區。比如 stdio.h 就是乙個包含一些有用資訊的檔案的名稱。

c將檔案看成是連續的位元組序列,其中每乙個位元組都可以單獨地讀取。這與 unix 環境(c的發源地)中的檔案結構是一致的。因為其他環境中的檔案模型可能會有所不同,所以 ansi c 提供了檔案的兩種檢視:文字檢視和二進位制檢視。

c將資料的輸入輸出看作是資料的流入和流出,不管是磁碟檔案或者是物理裝置都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一 種流,而不管它的具體結構的方法很有利於程式設計,而涉及流的輸出操作函式可用於各種物件,與其具體的實體無關,即具有通用性。

二、文字檢視和二進位制檢視區別 

二進位制檢視中每個位元組都可以為程式所訪問。

在文字檢視中,程式看到的內容和檔案的內容有可能不同(非 unix 環境)。舉例,dos下有個檔案 test.txt,內容為

hello\r\nworld\r\n^z

當以二進位制模式開啟 test.txt 時,c程式看到的內容跟原來一樣(如下),此時,沒有任何對映發生。

hello\r\n

world\r\n

^z

當以文字模式開啟 test.txt 時,c程式看到的是如下內容:(注意行尾和檔案結束符)

hello\nworld\n

也就是說使用文字檢視讀取檔案時,將把行尾的本地環境表示法對映為 c 檢視;在輸出的時候,也會將 c 檢視中的行尾表示對映為本地環境表示法。這樣,c 通過文字檢視巧妙的將不同環境(dos,mac)下的檔案轉換為相同的表示(unix下的表示法)。

而二進位制檢視則與原檔案沒有絲毫變化!有點理解了吧?

三、文字檔案與二進位制檔案

文字檔案是基於字元編碼的檔案,基本是定長的,常見的編碼有ascii編碼,unicode編碼等等。二進位制檔案是基於值編碼的檔案,變長編碼,你可以根據具體應用,指定某個值是什麼意思(這樣乙個過程,可以看作是自定義編碼)。

文字工具開啟乙個檔案的過程是怎樣的呢?拿記事本來說,它首先讀取檔案物理上所對應的二進位制位元流,然後按照你所選擇的解碼方式來解釋這個流,最後將解釋結果顯示出來。當用記事本開啟二進位制檔案時,由於按既定的字元編碼工作(如ascii碼),所以出現亂碼也是很必然的一件事情了。

文字檔案編碼基於字元定長,解碼容易些;二進位制檔案編碼是變長的,所以它靈活,儲存利用率要高些,解碼難一些(不同的二進位制檔案格式,有不同的解碼方式)。 文字檔案的可讀性要好些,儲存要花費轉換時間(讀寫要編譯碼),而二進位制檔案可讀性差(需要具體的檔案解碼器),儲存不存在轉換時間(讀寫不要編譯碼,直接寫值)。

你懂了嗎?

C語言中的文字流與二進位製流的區別

c語言中的文字流與二進位製流的區別 在c中引入了流 stream 的概念。它將資料的輸入輸出看作是資料的流入和流出,這樣不管是磁碟檔案或者是物理裝置 印表機 顯示器 鍵盤等 都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸...

文字流與二進位製流的區別

一 文字檔案與二進位制檔案的定義 簡單來說,文字檔案是基於字元編碼的檔案,常見的編碼有ascii編碼,unicode編碼等等。二進位制檔案是基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼意思 這樣乙個過程,可以看作是自定義編碼 從上面可以看出文字檔案基本上是定長編碼的 也有非定長的編碼如ut...

二進位製流與文字流的區別

在c中引入了流 stream 的概念。它將資料的輸入輸出看作是資料的流入和留出,這樣不管是磁碟檔案或者是物理裝置 印表機 顯示器 鍵盤等 都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的屋裡解構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一種流,而不管它...