以二進位制和文字的方式讀寫檔案

2021-06-18 04:21:24 字數 3763 閱讀 4766

文字方式開啟的檔案具有一定的格式,說明讀取時是要按照一定的編碼規範來讀取的,而二進位制方式讀取是直接從檔案中讀取包含0,1的二進位製流,沒有任何格式。因此,fread讀取以文字方式開啟的檔案時,等於是讀取了包含格式的二進位製流,因此會出錯。

字元是乙個二進位制資料的特殊表現形式,它仍是資料

字元 'a'=65 =0x41,如果當成字元是a,如果當成資料 就是十進位制數65;

文字檔案僅包含ascii標準的字元;

文字檔案的回車(\n)轉換成回車換行(\n\r),然後寫入檔案;

文字檔案的結尾最後乙個資料為 eof;

二進位制檔案內容可以是任何資料

寫檔案有文字格式和二進位制格式之分,ios::binary就是二進位制

它與文字格式的差別在於, 文字格式會增加一些格式上的資訊,比如換行'\n'用文字輸出是兩個位元組0x0ah,0x0dh,而如用二進位制輸出則是0x0ah

故而 txt的位元組數 > bin的位元組數

讀檔案時最大的區別:文字方式在遇到第乙個eof字元(ascii:26)時就結束,二進位制方式直到檔案結尾。

文字檔案本身跟二進位制檔案一樣,都是由0/1位組成,只是一般所說的文字檔案每8位(一位元組)必須是可顯示的ascii碼範圍(0~127),而二進位制每8位任意(0~255)。

文字檔案與二進位制檔案存檔時都是按二進位制存的.

區別在於:文字檔案是一其中的乙個特例.它存放的ascii碼都是可讀的部分.也就是說,存放的全是字元型的資料.因此可以說,如果存放的資料不含有字元型的資料,可以狹意的稱之為二進位制檔案.

廣義的來說,檔案全是二進位制的檔案!

補充說明:不可見的ascii碼,俗稱亂碼!

--------------------------

任何非執行檔案都能被記事體開啟!

區別是你能否看得懂,乙個是可讀的有義意的文字,乙個是無意義的亂碼

-------------------

如果你想用記事體開啟的檔案是亂碼的話.你寫入檔案時的資料,選用非char型的就可以了.

一、文字檔案與二進位制檔案的定義

別並不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異。

簡單來說,文字檔案是基於字元編碼的檔案,常見的編碼有ascii編碼,unicod

e編碼等等。二進位制檔案是基於值編碼的檔案,你可以根據具體應用,指定某個值是什麼

意思(這樣乙個過程,可以看作是自定義編碼)。

從上面可以看出文字檔案基本上是定長編碼的,基於字元嘛,每個字元在具體編

碼中是固定的,ascii碼是8個位元的編碼,unicode一般佔16個位元。而二進位制檔案可看

成是變長編碼的,因為是值編碼嘛,多少個位元代表乙個值,完全由你決定。大家可能

對bmp檔案比較熟悉,就拿它舉例子吧,其頭部是固定長度的14位元組的檔案頭,然後是40個位元組的點陣圖資訊頭。。。大家可以看出來了吧,其編碼是基於值的(不定長的,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_nu

ll_soh"這四個控制符。

文字檔案的儲存與其讀取基本上是個逆過程,不再累述。而二進位制檔案的訪問顯然

與文字檔案的訪問差不多,只是編/解碼方式不同而已,也不再敘述。

三、文字檔案與二進位制檔案的優缺點

因為文字檔案與二進位制檔案的區別僅僅是編碼上不同,所以他們的優缺點就是編碼

的優缺點,這個找本編碼的書來看看就比較清楚了。一般認為,文字檔案編碼基於字元

定長,解碼容易些;二進位制檔案編碼是變長的,所以它靈活,儲存利用率要高些,解碼

難一些(不同的二進位制檔案格式,有不同的解碼方式)。關於空間利用率,想想看,二

進製檔案甚至可以用乙個位元來代表乙個意思(位操作),而文字檔案任何乙個意思至少

是乙個字元.

很多書上還認為,文字檔案的可讀性要好些,儲存要花費轉換時間(讀寫要編譯碼)

,而二進位制檔案可讀性差,儲存不存在轉換時間(讀寫不要編譯碼,直接寫值).這裡

的可讀性是從軟體使用者角度來說的,因為我們用通用的記事本工具就幾乎可以瀏覽所

有文字檔案,所以說文字檔案可讀性好;而讀寫乙個具體的二進位制檔案需要乙個具體的

檔案解碼器,所以說二進位制檔案可讀性差,比如讀bmp檔案,必須用讀圖軟體.而這裡的

儲存轉換時間應該是從程式設計的角度來說的,因為有些作業系統如windows需要對回車換行

符進行轉換(將''\n'',換成''\r\n'',所以檔案讀寫時,作業系統需要乙個乙個字元的檢查

當前字元是不是''\n''或''\r\n'').這個在儲存轉換在linux作業系統中並不需要,當然,當

在兩個不同的作業系統上共享檔案時,這種儲存轉換又可能出來(如linux系統和window

indows文字檔案間的轉換》給出^_^

四、c的文字讀寫和二進位制讀寫

應該說c的文字讀寫與二進位制的讀寫是乙個程式設計層次上的問題,與具體的作業系統

有關,所以」用文字方式讀寫的檔案一定是文字檔案,用二進位制讀寫的檔案一定是二進

制檔案"這類觀點是錯誤的.下面的講述非明確指出作業系統型別,都暗指windows.

c的文字方讀寫與二進位制讀寫的差別僅僅體現在回車換行符的處理上 .文字方式寫

時,每遇到乙個''\n''(0ah換行符),它將其換成''\r\n''(0d0ah,回車換行),然後再寫入

檔案;當文字讀取時,它每遇到乙個''\r\n''將其反變化為''\n'',然後送到讀緩衝區.正

因為文字方式有''\n''--''\r\n''之間的轉換,其存在轉換耗時.二進位制讀寫時,其不存

在任何轉換,直接將寫緩衝區中資料寫入檔案.

總地來說,從程式設計的角度來說,c中文字或二進位制讀寫都是緩衝區與檔案中二進

製流的互動,只是文字讀寫時有回車換行的轉換.所以當寫緩衝區中無換行符''\n''(0ah

),文字寫與二進位制寫的結果是一樣的,同理,當檔案中不存在''\r\n''(0dh0ah)時,文字

讀與二進位制讀的結果一樣.

c 開啟檔案方式(二進位制和文字)

c語言檔案操作的乙個問題 c語言中開啟檔案有兩種方式,一種是二進位制方式,另一種是文字方式 ascii碼方式 這兩種方式有什麼區別?對於linux這種只有一種檔案型別的作業系統來說是沒有區別的 我們就以windows為例說說區別 a.以文字方式開啟檔案,若將資料寫入檔案,如果遇到換行符 n asii...

二進位制檔案讀寫

define crt secure no warnings include include include size t fread void buffer,size t size,size t count,file stream size t fwrite const void buffer,si...

二進位制檔案和文字檔案

通常,我們喜歡把檔案分為二進位制檔案 binary file 和文字檔案 text file 兩類。但事實上,所有檔案在計算機上都是以二進位制方式進行儲存的,因此二者並無本質上的區別,它們的區別僅在於對檔案內容的解釋方式上。a 文字檔案,就是根據字元編碼規則解碼後,能夠全部解碼為文字字元的 二進位制...