国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
文本文件與二進(jìn)制文件

文本文件與二進(jìn)制文件

一、文本文件與二進(jìn)制文件的定義

       大家都知道計(jì)算機(jī)的存儲(chǔ)在物理上是二進(jìn)制的,所以文本文件與二進(jìn)制文件的區(qū)
別并不是物理上的,而是邏輯上的。這兩者只是在編碼層次上有差異。

       簡(jiǎn)單來(lái)說(shuō),文本文件是基于字符編碼的文件,常見(jiàn)的編碼有ASCII編碼,UNICOD
E編碼等等。二進(jìn)制文件是基于值編碼的文件,你可以根據(jù)具體應(yīng)用,指定某個(gè)值是什么
意思(這樣一個(gè)過(guò)程,可以看作是自定義編碼)。

       從上面可以看出文本文件基本上是定長(zhǎng)編碼的,基于字符嘛,每個(gè)字符在具體編
碼中是固定的,ASCII碼是8個(gè)比特的編碼,UNICODE一般占16個(gè)比特。而二進(jìn)制文件可看
成是變長(zhǎng)編碼的,因?yàn)槭侵稻幋a嘛,多少個(gè)比特代表一個(gè)值,完全由你決定。大家可能
對(duì)BMP文件比較熟悉,就拿它舉例子吧,其頭部是較為固定長(zhǎng)度的文件頭信息,前2字節(jié)
用來(lái)記錄文件為BMP格式,接下來(lái)的8個(gè)字節(jié)用來(lái)記錄文件長(zhǎng)度,再接下來(lái)的4字節(jié)用來(lái)記
錄bmp文件頭的長(zhǎng)度。。。大家可以看出來(lái)了吧,其編碼是基于值的(不定長(zhǎng)的,2、4、
8字節(jié)長(zhǎng)的值都有),所以BMP是二進(jìn)制文件。

二、文本文件與二進(jìn)制文件的存取

       文本工具打開(kāi)一個(gè)文件的過(guò)程是怎樣的呢?拿記事本來(lái)說(shuō),它首先讀取文件物理
上所對(duì)應(yīng)的二進(jìn)制比特流(前面已經(jīng)說(shuō)了,存儲(chǔ)都是二進(jìn)制的),然后按照你所選擇的
解碼方式來(lái)解釋這個(gè)流,然后將解釋結(jié)果顯示出來(lái)。一般來(lái)說(shuō),你選取的解碼方式會(huì)是
ASCII碼形式(ASCII碼的一個(gè)字符是8?jìng)€(gè)比特),接下來(lái),它8個(gè)比特8個(gè)比特地來(lái)解釋
這個(gè)文件流。例如對(duì)于這么一個(gè)文件流"01000000_01000001_01000010_01000011"(下劃
線''_'',是我為了增強(qiáng)可讀性,而手動(dòng)添加的),第一個(gè)8比特''01000000''按ASCII碼來(lái)解
碼的話(huà),所對(duì)應(yīng)的字符是字符''A'',同理其它3個(gè)8比特可分別解碼為''BCD'',即這個(gè)文件
流可解釋成“ABCD”,然后記事本就將這個(gè)“ABCD”顯示在屏幕上。

        事實(shí)上,世界上任何東西要與其他東西通信會(huì)話(huà),都存在一個(gè)既定的協(xié)議,既
定的編碼。人與人之間通過(guò)文字聯(lián)絡(luò),漢字“媽”代表生你的那個(gè)人,這就是一種既定
的編碼。但注意到這樣一種情況,漢字“媽”在日本文字里有可能是你生下的那個(gè)人,
所以當(dāng)一個(gè)中國(guó)人A與日本B之間用“媽”這個(gè)字進(jìn)行交流,出現(xiàn)誤解就很正常的。用
記事本打開(kāi)二進(jìn)制文件與上面的情況類(lèi)似。記事本無(wú)論打開(kāi)什么文件都按既定的字符編
碼工作(如ASCII碼),所以當(dāng)他打開(kāi)二進(jìn)制文件時(shí),出現(xiàn)亂碼也是很必然的一件事情了
,解碼和譯碼不對(duì)應(yīng)嘛。例如文件流''00000000_00000000_00000000_00000001''可能在二
進(jìn)制文件中對(duì)應(yīng)的是一個(gè)四字節(jié)的整數(shù)int 1,在記事本里解釋就變成了"NULL_NULL_NU
LL_SOH"這四個(gè)控制符。

  文本文件的存儲(chǔ)與其讀取基本上是個(gè)逆過(guò)程,不再累述。而二進(jìn)制文件的存取顯然
與文本文件的存取差不多,只是編/解碼方式不同而已,也不再敘述。

  

三、文本文件與二進(jìn)制文件的優(yōu)缺點(diǎn)

  因?yàn)槲谋疚募c二進(jìn)制文件的區(qū)別僅僅是編碼上不同,所以他們的優(yōu)缺點(diǎn)就是編碼
的優(yōu)缺點(diǎn),這個(gè)找本編碼的書(shū)來(lái)看看就比較清楚了。一般認(rèn)為,文本文件編碼基于字符
定長(zhǎng),譯碼容易些;二進(jìn)制文件編碼是變長(zhǎng)的,所以它靈活,存儲(chǔ)利用率要高些,譯碼
難一些(不同的二進(jìn)制文件格式,有不同的譯碼方式)。關(guān)于空間利用率,想想看,二
進(jìn)制文件甚至可以用一個(gè)比特來(lái)代表一個(gè)意思(位操作),而文本文件任何一個(gè)意思至少
是一個(gè)字符.

  很多書(shū)上還認(rèn)為,文本文件的可讀性要好些,存儲(chǔ)要花費(fèi)轉(zhuǎn)換時(shí)間(讀寫(xiě)要編譯碼)
,而二進(jìn)制文件可讀性差,存儲(chǔ)不存在轉(zhuǎn)換時(shí)間(讀寫(xiě)不要編解碼,直接寫(xiě)值).這里
的可讀性是從軟件使用者角度來(lái)說(shuō)的,因?yàn)槲覀冇猛ㄓ玫挠浭卤竟ぞ呔蛶缀蹩梢詾g覽所
有文本文件,所以說(shuō)文本文件可讀性好;而讀寫(xiě)一個(gè)具體的二進(jìn)制文件需要一個(gè)具體的
文件解碼器,所以說(shuō)二進(jìn)制文件可讀性差,比如讀BMP文件,必須用讀圖軟件.而這里的
存儲(chǔ)轉(zhuǎn)換時(shí)間應(yīng)該是從編程的角度來(lái)說(shuō)的,因?yàn)橛行┎僮飨到y(tǒng)如windows需要對(duì)回車(chē)換行
符進(jìn)行轉(zhuǎn)換(將''\n'',換成''\r\n'',所以文件讀寫(xiě)時(shí),操作系統(tǒng)需要一個(gè)一個(gè)字符的檢查
當(dāng)前字符是不是''\n''或''\r\n'').這個(gè)在存儲(chǔ)轉(zhuǎn)換在Linux操作系統(tǒng)中并不需要,當(dāng)然,當(dāng)
在兩個(gè)不同的操作系統(tǒng)上共享文件時(shí),這種存儲(chǔ)轉(zhuǎn)換又可能出來(lái)(如Linux系統(tǒng)和Window
s系統(tǒng)共享文本文件)。關(guān)于這個(gè)轉(zhuǎn)換怎樣進(jìn)行,我將在下一篇文章《Linux文本文件與W
indows文本文件間的轉(zhuǎn)換》給出^_^

四、C的文本讀寫(xiě)和二進(jìn)制讀寫(xiě)

  應(yīng)該說(shuō)C的文本讀寫(xiě)與二進(jìn)制的讀寫(xiě)是一個(gè)編程層次上的問(wèn)題,與具體的操作系統(tǒng)
有關(guān),所以"用文本方式讀寫(xiě)的文件一定是文本文件,用二進(jìn)制讀寫(xiě)的文件一定是二進(jìn)
制文件"這類(lèi)觀點(diǎn)是錯(cuò)誤的.下面的講述非明確指出操作系統(tǒng)類(lèi)型,都暗指windows.

 ?。玫奈谋痉阶x寫(xiě)與二進(jìn)制讀寫(xiě)的差別僅僅體現(xiàn)在回車(chē)換行符的處理上.文本方式寫(xiě)
時(shí),每遇到一個(gè)''\n''(0AH換行符),它將其換成''\r\n''(0D0AH,回車(chē)換行),然后再寫(xiě)入
文件;當(dāng)文本讀取時(shí),它每遇到一個(gè)''\r\n''將其反變化為''\n'',然后送到讀緩沖區(qū).正
因?yàn)槲谋痉绞接?'\n''--''\r\n''之間的轉(zhuǎn)換,其存在轉(zhuǎn)換耗時(shí).二進(jìn)制讀寫(xiě)時(shí),其不存
在任何轉(zhuǎn)換,直接將寫(xiě)緩沖區(qū)中數(shù)據(jù)寫(xiě)入文件.

   總地來(lái)說(shuō),從編程的角度來(lái)說(shuō),C中文本或二進(jìn)制讀寫(xiě)都是緩沖區(qū)與文件中二進(jìn)
制流的交互,只是文本讀寫(xiě)時(shí)有回車(chē)換行的轉(zhuǎn)換.所以當(dāng)寫(xiě)緩沖區(qū)中無(wú)換行符''\n''(0AH
),文本寫(xiě)與二進(jìn)制寫(xiě)的結(jié)果是一樣的,同理,當(dāng)文件中不存在''\r\n''(0DH0AH)時(shí),文本
讀與二進(jìn)制讀的結(jié)果一樣.

   下面給出一個(gè)小程序來(lái)證明前面的觀點(diǎn).

1、編寫(xiě)如下程序.該程序?qū)⒆址?12\n3"分別以文本方式和二進(jìn)制方式寫(xiě)入test1和t
est2,然后再以文本方式

讀test1,以二進(jìn)制方式讀test2.

#include<stdio.h>

int main()

{

    FILE * fp_text,* fp_binary;

    char write_buf[4]={''1'',''2'',''\n'',''3''};

    char read_buf_text[6],read_buf_binary[6];

    int read_count_text,read_count_binary;

    //未檢測(cè)打開(kāi)是否失敗

    fp_text=fopen("test1","wt+");

    fp_binary=fopen("test2","wb+");

    fwrite(write_buf,4,1,fp_text);

    fwrite(write_buf,4,1,fp_binary);

    //fflush(fp_text);

    //fflush(fp_binary);


    fseek(fp_text,0L,SEEK_SET);//fseek附帶了fflush功能

    fseek(fp_binary,0L,SEEK_SET);//

    read_count_text=fread(read_buf_text,sizeof(char),5,fp_text);

    read_count_binary=fread(read_buf_binary,sizeof(char),5,fp_binary);

    //加''\0'',便于打印字符串

    read_buf_text[read_count_text]=''\0'';

    read_buf_binary[read_count_binary]=''\0'';

    printf("In Text Mode:read_count=%d,string=%s\n",read_count_text,read_buf
_text);

    printf("In Binary Mode:read_count=%d,string=%s\n",read_count_binary,read
_buf_binary);

    fclose(fp_text);

    fclose(fp_binary);

    return 0;

   

}

2、該程序在VC6.0下編譯運(yùn)行,顯示結(jié)果如下(追憶"\\"及其右邊內(nèi)容是我手動(dòng)加的注釋
):

 In Text Mode:read_count=4,string=12

3                           //文本方式讀test1,讀到的字符與原先寫(xiě)入test1的
字符一樣

In Binary Mode:read_count=4,string=12

3                           //二進(jìn)制方式讀test1,讀到的字符與原先寫(xiě)入test1
的字符一樣

3.用記事本打開(kāi)test1和test2,結(jié)果如下:

test1的內(nèi)容:

12

3           //文本方式寫(xiě)入的,有換行效果,參看下面的4

test2的內(nèi)容

123         //二進(jìn)制方式寫(xiě)入的,

無(wú)換行效果(記事本對(duì)"\r\n"之外的控制字符串無(wú)
顯示效果),參看下面的4

4、用vc6.0以Binary方式(二進(jìn)制方式)打開(kāi)test1和test2,結(jié)果如下(用其他二進(jìn)制讀
寫(xiě)軟件也可以) 

test1的內(nèi)容

31 32 0D 0A 33//十六進(jìn)制,5個(gè)字節(jié),比寫(xiě)入緩沖區(qū)多了一個(gè)字節(jié),在''\n''(0AH)前
插了一個(gè)''\r''(0DH)

test2的內(nèi)容

31 32 0A 33//十六進(jìn)制,4個(gè)字節(jié),與寫(xiě)入緩沖區(qū)的值一致.

 

5、總結(jié)

     從4可以看出,文本方式寫(xiě)時(shí),存在''\n''->''\r\n''的轉(zhuǎn)換,而二進(jìn)制方式無(wú)轉(zhuǎn)換.
又從2和4可以推出,文本方式讀時(shí)存在''\r\n''->至''\n''的轉(zhuǎn)換,而二進(jìn)制方式無(wú)轉(zhuǎn)換.
有興趣的讀者可以,以二進(jìn)制方式讀test1或以文本方式讀test2,看會(huì)出現(xiàn)什么效果

6.補(bǔ)充說(shuō)明

   上述說(shuō)明僅適用于windows,在linux中文本方式的讀寫(xiě)與二進(jìn)制方式的讀寫(xiě)無(wú)差
別,不存在回車(chē)換行間的轉(zhuǎn)換.這樣當(dāng)直接在windows和linux中共享文件時(shí),將會(huì)出現(xiàn)
與回車(chē)換行相關(guān)的問(wèn)題.
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
以文本格式和二進(jìn)制格式打開(kāi)文件,到底有什么區(qū)別?
小小換行符亂談(文本文件vs二進(jìn)制文件)
FTP中Binary二進(jìn)制與ASCII傳輸模式的區(qū)別
ABAP 里文件操作涉及到中文字符集的問(wèn)題和解決方案試讀版
【2020Python修煉記】Python語(yǔ)法入門(mén)-字符編碼
存文本文件及其字符編碼
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服