在c中引入了流(stream)的概念。它將資料的輸入輸出看作是資料的流入和流出,這樣不管是磁碟檔案或者是物理裝置(印表機、顯示器、鍵盤等),都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一種流,而不管它的具體結構的方法很有利於程式設計,而涉及流的輸出操作函式可用於各種物件,與其具體的實體無關,即具有通用性。
在c中流可分為兩大類,即文字流(text stream)和二進位製流(binarystream)。所謂文字流是指在流中流動的資料是以字元形式出現。在文字流中,'\n'被換成回車cr和換行lf的**0dh和0ah。而當輸出時,則0dh和0ah本換成'\n'。
二進位製流是指流動的是二進位制數字序列,若流中有字元,則用乙個位元組的二進位制ascii碼表示,若是數字,則用乙個位元組的二進位制數表示。在流入流出時,對\n符號不進行變換。例如2001這個數,在文字流中用其ascii碼表示為:
'2' '0' '0' '1'
| | | |
50 48 48 49
共佔4位元組。而在二進位製流中則表示為:00000111 11010001 用十六進製制就是07d1。只佔兩位元組。
由此看出,二進位製流比文字流節省空間,且不用進行對\n的轉換,這樣可以大大加快流的速度,提高效率。因而,對於含有大量數字資訊的數字流,可以採用二進位製流的方式;對於含有大量字元資訊的流,則採用文字流的方式。
一、文字檔案與二進位制檔案的定義
簡單來說,文字檔案是基於字元編碼的檔案,常見的編碼有ascii編碼,unicode編碼等等。二進位制檔案是基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼意思(這樣乙個過程,可以看作是自定義編碼)。
從上面可以看出文字檔案基本上是定長編碼的(也有非定長的編碼如utf-8),基於字元嘛,每個字元在具體編碼中是固定的,ascii碼是8個位元的編碼,unicode一般佔16個位元。而二進位制檔案可看成是變長編碼的,因為是值編碼嘛,多少個位元代表乙個值,完全由你決定。大家可能對bmp檔案比較熟悉,就拿它舉例子吧,其頭部是較為固定長度的檔案頭資訊,前2位元組用來記錄檔案為bmp格式,接下來的8個位元組用來記錄檔案長度,再接下來的4位元組用來記錄bmp檔案頭的長度。。。大家可以看出來了吧,其編碼是基於值的(不定長的,2、4、8位元組長的值都有),所以bmp是二進位制檔案。
二、文字檔案與二進位制檔案的訪問
文字工具開啟乙個檔案的過程是怎樣的呢?拿記事本來說,它首先讀取檔案物理上所對應的二進位制位元流(前面已經說了,儲存都是二進位制的),然後按照你所選擇的解碼方式來解釋這個流,然後將解釋結果顯示出來。一般來說,你選取的解碼方式會是ascii碼形式(ascii碼的乙個字元是8個位元),接下來,它8個位元8個比特地來解釋這個檔案流。例如對於這麼乙個檔案流"01000000_01000001_01000010_01000011"(下劃線''_'',是我為了增強可讀性,而手動新增的),第乙個8位元''01000000''按ascii碼來解碼的話,所對應的字元是字元''a'',同理其它3個8位元可分別解碼為''bcd'',即這個檔案流可解釋成「abcd」,然後記事本就將這個「abcd」顯示在螢幕上。
事實上,世界上任何東西要與其他東西通訊會話,都存在乙個既定的協議,既定的編碼。人與人之間通過文字聯絡,漢字「媽」代表生你的那個人,這就是一種既定的編碼。但注意到這樣一種情況,漢字「媽」在日本文字裡有可能是你生下的那個人,所以當乙個中國人a與日本b之間用「媽」這個字進行交流,出現誤解就很正常的。用記事本開啟二進位制檔案與上面的情況類似。記事本無論開啟什麼檔案都按既定的字元編碼工作(如ascii碼),所以當他開啟二進位制檔案時,出現亂碼也是很必然的一件事情了,解碼和解碼不對應嘛。例如檔案流''00000000_00000000_00000000_00000001''可能在二
進製檔案中對應的是乙個四位元組的整數int 1,在記事本裡解釋就變成了"null_null_null_soh"這四個控制符。
文字檔案的儲存與其讀取基本上是個逆過程,不再累述。而二進位制檔案的訪問顯然與文字檔案的訪問差不多,只是編/解碼方式不同而已,也不再敘述。
三、文字檔案與二進位制檔案的優缺點
因為文字檔案與二進位制檔案的區別僅僅是編碼上不同,所以他們的優缺點就是編碼的優缺點,這個找本編碼的書來看看就比較清楚了。一般認為,文字檔案編碼基於字元定長,解碼容易些;二進位制檔案編碼是變長的,所以它靈活,儲存利用率要高些,解碼難一些(不同的二進位制檔案格式,有不同的解碼方式)。關於空間利用率,想想看,二進位制檔案甚至可以用乙個位元來代表乙個意思(位操作),而文字檔案任何乙個意思至少是乙個字元.
很多書上還認為,文字檔案的可讀性要好些,儲存要花費轉換時間(讀寫要編譯碼),而二進位制檔案可讀性差,儲存不存在轉換時間(讀寫不要編譯碼,直接寫值).這裡的可讀性是從軟體使用者角度來說的,因為我們用通用的記事本工具就幾乎可以瀏覽所有文字檔案,所以說文字檔案可讀性好;而讀寫乙個具體的二進位制檔案需要乙個具體的檔案解碼器,所以說二進位制檔案可讀性差,比如讀bmp檔案,必須用讀圖軟體.而這裡的儲存轉換時間應該是從程式設計的角度來說的,因為有些作業系統如windows需要對回車換行符進行轉換(將''\n'',換成''\r\n'',所以檔案讀寫時,作業系統需要乙個乙個字元的檢查
當前字元是不是''\n''或''\r\n'').這個在儲存轉換在linux作業系統中並不需要,當然,當在兩個不同的作業系統上共享檔案時,這種儲存轉換又可能出來(如linux系統和windows系統共享文字檔案)。
四、c的文字讀寫和二進位制讀寫
c的文字方讀寫與二進位制讀寫的差別僅僅體現在回車換行符的處理上.文字方式寫時,每遇到乙個''\n''(0ah換行符),它將其換成''\r\n''(0d0ah,回車換行),然後再寫入檔案;當文字讀取時,它每遇到乙個''\r\n''將其反變化為''\n'',然後送到讀緩衝區.正因為文字方式有''\n''--''\r\n''之間的轉換,其存在轉換耗時.二進位制讀寫時,其不存在任何轉換,直接將寫緩衝區中資料寫入檔案.
總地來說,從程式設計的角度來說,c中文字或二進位制讀寫都是緩衝區與檔案中二進位製流的互動,只是文字讀寫時有回車換行的轉換.所以當寫緩衝區中無換行符''\n''(0ah),文字寫與二進位制寫的結果是一樣的,同理,當檔案中不存在''\r\n''(0dh0ah)時,文字讀與二進位制讀的結果一樣.
五、例項
5678的儲存形式為:ascii碼:
00110101
00110110
00110111
00111000 (四個位元組)
5678的儲存形式為:二進位制:
00010110
00101110 (兩個位元組)
二進位制檔案和文字檔案的唯一差異就是前者含有一些非標準輸出的ascii碼。0x01就是非標準輸出的ascii碼,0x61就是標準輸出的ascii碼。)
二進位製流和文字流區別C
在c中引入了流 stream 的概念。它將資料的輸入輸出看作是資料的流入和流出,這樣不管是磁碟檔案或者是物理裝置 印表機 顯示器 鍵盤等 都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一種流,而不管它...
二進位製流和文字流的區別
在c中引入了流 stream 的概念。它將資料的輸入輸出看作是資料的流入和留出,這樣不管是磁碟檔案或者是物理裝置 印表機 顯示器 鍵盤等 都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的屋裡解構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一種流,而不管它...
文字流和二進位製流
華清遠見 楊碩 我們在寫 c程式的時候經常會涉及到對流的操作,比如說從標準輸入流讀取一串字串,然後通過標準輸出流輸出顯示在螢幕上,這也就是所謂的 io操作。那麼流究竟是什麼東西?下面首先對流這個概念做一下解釋。一 流 stream 的概念 計算機有很多外部裝置,比如鍵盤 滑鼠 cd rom io操作...