文本文件和二进制文件有什么区别?



从文件编码的方式来看,文件可分为ASCII码文件二进制码文件两种。

1、ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:
ASC码:  00110101 00110110 00110111 00111000
     ↓     ↓    ↓    ↓
十进制码: 5     6    7    8 共占用4个字节。
ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。

2、二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。

3、一个文件可以以文本模式或二进制模式打开,这两种的区别是:

在文本模式中回车被当成一个字符'/n',而二进制模式认为它是两个字符0x0D,0x0A;

如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换

4、大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
简单来说,

  • 文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
  • 二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。
5、上面可以看出文本文件基本上是定长编码的,基于字符,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。
而二进制文件可看成是变长编码的,因为是值编码,多少个比特代表一个值,完全由你决定


6、C的文本读写和二进制读写
 
应该说C的文本读写与二进制的读写是一个编程层次上的问题,与具体的操作系统有关。
所以"用文本方式读写的文件一定是文本文件,用二进制读写的文件一定是二进制文件"这类观点是错误的.下面的讲述非明确指出操作系统类型,都暗指windows。
C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上。

 文本方式写时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区。
二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件。

对于内容为 “Ab123\r\n" (41 62 31 32 33 0D 0A)的文件,
pf1 = fopen("f:\\1.txt","r");或者pf1 = fopen("f:\\1.txt","rb");
for(int i=0;i <6;i++){
  fread(&a[i],1,1,pf1);
   printf("%0X ",a[i]);
}
fclose(pf1);//关闭文件

的结果分别为:
41 62 31 32 330A         和    41 62 31 32 33 0D

你可能感兴趣的:(C语言)