`
小鑫的java
  • 浏览: 143136 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

二进制文件和文本文件

阅读更多

一、文本文件与二制文件的定

       大家都知道算机的存在物理上是二制的,所以文本文件与二制文件的区

并不是物理上的,而是逻辑上的。两者只是在编码层次上有差异。

       简单,文本文件是基于字符编码的文件,常编码ASCII编码UNICOD

E编码等等。二制文件是基于值编码的文件,你可以根据具体用,指定某个是什

意思(这样一个程,可以看作是自定义编码)。

       从上面可以看出文本文件基本上是定长编码的,基于字符嘛,个字符在具体

中是固定的,ASCII8个比特的编码UNICODE一般占16个比特。而二制文件可看成是变长编码的,因值编码嘛,多少个比特代表一个,完全由你决定。大家可能

BMP文件比熟悉,就拿它例子吧,其部是较为固定度的文件畔ⅲ?

用来记录文件BMP格式,接下来的8个字用来记录文件度,再接下来的4用来

bmp文件度。。。大家可以看出来了吧,其编码是基于的(不定的,24

8节长都有),所以BMP是二制文件。

 

二、文本文件与二制文件的存取

       文本工具打一个文件的程是怎的呢?拿事本来,它首先取文件物理

上所对应的二制比特流(前面已经说了,存都是二制的),然后按照你所选择

方式来解释这个流,然后将解释结示出来。一般来,你取的解方式会是

ASCII形式(ASCII的一个字符是8个比特),接下来,它8个比特8个比特地来解

个文件流。例如这么一个文件流"01000000_01000001_01000010_01000011"(下划

线''_'',是我了增性,而手添加的),第一个8比特''01000000''ASCII来解

,所对应的字符是字符''A'',同理其它38比特可分码为''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操作系中并不需要,当然,当

在两个不同的操作系上共享文件这种储转换又可能出来(LinuxWindow

s共享文本文件)转换样进行,我将在下一篇文章《Linux文本文件与W

indows文本文件转换^_^

 

四、C的文本写和二

  应该说C的文本写与二制的写是一个次上的问题,与具体的操作系

,所以"用文本方式写的文件一定是文本文件,用二写的文件一定是二

制文件"这类观点是错误的.下面的述非明确指出操作系统类型,都暗指windows

  C的文本方写与二写的差别仅仅在回车换行符的理上 .文本方式写

遇到一个''\n''(0AH行符),它将其''\r\n''(0D0AH,回车换),然后再写入

文件;当文本,它遇到一个''\r\n''将其反''\n'',然后送到读缓冲区.正

文本方式有''\n''--''\r\n''转换,其存在转换.二,其不存

在任何转换,直接将写冲区中数据写入文件.

   地来,从程的角度来,C中文本或二写都是冲区与文件中二

制流的交互,只是文本有回车换行的转换.所以当写冲区中无行符''\n''(0AH

),文本写与二制写的果是一的,同理,当文件中不存在''\r\n''(0DH0AH),文本

与二果一

 

   下面出一个小程序来明前面的点.

1写如下程序.程序将字符串"12\n3"以文本方式和二制方式写入test1t

est2,然后再以文本方式

 

test1,以二制方式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;

    //检测是否失

    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);//fseekfflush功能

    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);

<p class
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics