二进制文件和非二进制文件

二进制文件和非二进制文件

 

1. 流式文件:文件中的数据是一串字符,没有结构。

2. 文本文件是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件,更确切地说,英文、数字等字符存储的是ASCII码,而汉字存储的是机内码。文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息,因此文本文件不能存储声音、动画、图像、视频等信息。

设某个文件的内容是下面一行文字: 中华人民共和国 CHINA 1949。如果以文本方式存储,机器中存储的是下面的代码(以十六进制表示,机器内部仍以二进制方式存储): D6 D0 BB AA C8 CB C3 F1 B9 B2 BA CD B9 FA 20 43 48 49 4E 41 20 31 39 34 39 A1 A3 其中,D6D0、BBAA、C8CB、C3F1、B9B2、BACD、B9FA分别是“中华人民共和国ABCD”七个汉字的机内码,20是空格的ASCII码,43、48、49、4E、41分别是五个英文字母“CHINA”的ASCII码,31、39、34、39分别是数字字符“1949”的ASCII编码,A1A3是标点“。”的机内码。从上面可以看出,文本文件中信息是按单个字符编码存储的,如1949分别存储“1”、“9”、 “4”、“9”这四个字符的ASCII编码,如果将1949存储为079D(对应二进制为0000 0111 1001 1101,即十进制1949的等值数),则该文件一定不是文本文件。

文本文件是包含用户可读信息的文件。这些文件以ASCII码方式存储,可显示和打印。文本文件的行不能包括空字符(即码中的NULL),行的最大长度(包括换行符在内)也不能超过(LINE_MAX)所定义的字节数。不过文本文件中并不限制使用除空字符以外的控制字符或其它不可打印字符。(二进制文件[此处指非文本文件]包含计算机可读信息的文件。二进制文件可以是可执行的文件,使系统根据其中的指令完成某项工作。命令和程序都是以可执行的而进制文件方式存储。二进制文件没有行的长度限制,也可包含空字符。)

3. 如果将存储的信息采用字符串方式来保存,那么称此类文件为文本文件(可以按字符显示)。将文件看作是由一个一个字节(byte)组成的,那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。

如果将存储的信息严格按其在内存中的存储形式来保存,则称此类文件为二进制文件。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。文本或字符文件代表慢速设备,而二进制文件代表可以大块数据操作的快速外设,二进制文件内容基本无意义,系统对它不加解释地传给调用者,解释由调用者负责.而对字符文件,系统把他理解为单字节的ASCII或多字节的UNICODE字符串,并且对其中的特殊字符(如回车等)加以特殊处理.所以同一个文件,可以使用不同类型的系统调用.

回车(CR)和换行(LF)符都是用来表示“下一行”的。而标准没有规定要使用哪一个。于是产生了三种不同的用法:

(1) Dos和windows采用回车+换行(CR+LF)表示下一行

(2) UNIX采用换行符(LF)表示下一行

(3) MAC机采用回车符(CR)表示下一行。

当在不同的系统间传递文件,就要涉及格式的转换。

文本方式和二进制方式的最大区别在于文本方式对于'\n'换行符的理解不同

(1)在DOS平台下,该字符会被展开成<CR>< LF>两个控制字符(相当于"\r\n"),在ASCII字符集下是 0DH,0AH

(2)在UNIX平台下,仅仅是<LF>,不会展开。

(3)在二进制方式下,不管是什么平台,'\n'都是精确的<LF>。

在linux/unix 系统上,只有一种文件类型的系统,带b字母的模式和对应的不带b字母的模式是相同的。

关于EOF:   EOF可以作为文本文件的结束标志,但不能作为二进制文件的结束符.feof函数既可以判断二进制文件,又可以判断文本文件. EOF在Windows下是ctrl+z,linux下是ctrl+D.

第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢? 其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;

最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。

4. 输入码、区位码、国标码与机内码 (都是汉字的编码形式)

键盘是当前微机的主要输入设备, 输入码就是使用英文键盘输入汉字时的编码。

计算机只识别由0、1组成的代码,ASCII码是英文信息处理的标准编码,汉字信息处理也必须有一个统一的标准编码。我国国家标准局于1981年5月颁布了《信息交换用汉字编码字符集——基本集》,代号为GB2312-80,共对6763个汉字和682个图形字符进行了编码,其编码原则为:汉字用两个字节表示,每个字节用七位码(高位为0),国家标准将汉字和图形符号排列在一个94行94列的二维代码表中,;每两个字节分别用两位十进制编码,前字节的编码称为区码,后字节的编码称为位码,此即区位码,如“保”字在二维代码表中处于17区第3位,区位码即为“1703 ”。

国标码并不等于区位码,它是由区位码稍作转换得到,其转换方法为:先将十进制区码和位码转换为十六进制的区码和位码,这样就得了一个与国标码有一个相对位置差的代码,再将这个代码的第一个字节和第二个字节分别加上20H,就得到国标码。如:“保”字的国标码为3123H,它是经过下面的转换得到的:1703D->1103H->+20H->3123H。

国标码是汉字信息交换的标准编码,但因其前后字节的最高位为0,与ASCII码发生冲突,如“保”字,国标码为31H和23H,而西文字符“1”和 “#”的SCII也为31H和23H,现假如内存中有两个字节为31H和23H,这到底是一个汉字”保”,还是两个西文字符“1”;和“#”?于是就出现了二义性,显然,国标码是不可能在计算机内部直接采用的,于是,;汉字的机内码采用变形国标码,其变换方法为:将国标码的每个字节都加上128,即将两个字节的最高位由0改1,其余7位不变,如:由上面我们知道,“保”字的国标码为3123H,前字节为00110001B,后字节为00100011B,高位改1为10110001B和10100011B即为B1A3H,因此,保字的机内码就是B1A3H;。

汉字信息处理过程众所周知,计算机并不能识别汉字,因此必须要把每个字符转换成计算机能唯一识别的由0和1组成的代码,这个代码称为机内码

汉字机内码的每个字节都大于128,这就解决了与西文字符的ASCII码冲突的问题。

5. 测试

FILE *fp;

                int i = 12;

                int j = 12;

               

                fp = fopen("01.txt","wb");

                fprintf(fp,"%d",i);

                fputc('\n',fp);

                fwrite(&j,sizeof(int),1,fp);

               

                fclose(fp);

即使是用二进制打开,但如果你用fputc,fputs,fprintf这些函数,其实还是和用文本文件打开一样。只有用到fwrite/fread函数,才会看到一个整型占4个字节。

按二进制写文件指的是直接按照数据在内存中的表现形式写入文件。例如,如果int型数据在内存中用 4 个字节表示,则写这个int数据的时候直接把对应的内存中 4 个字节的内容写入文件。在此过程中数据不需要做任何转换,所以效率较高。

数 据有字符型和非字符型(数)两种。按文本方式写文件指的是将数据转换为对应的字符型数据之后再写入文件。对于字符型数据,由于其本身就是ASCII码字符,一般不必转换,直接写入文件。但是,由于不同的系统对于换行符('\n')有不同的处理(转换)方式,在有的系统(如Windows)下也会对 '\ n'作适当的转换。

对于非字符型数据,都要进行转换处理。例如:int m = 12; 以及 double f = 2.3;,分别按照 "%d"、"%lf"方式将 m和 f 写入文件的时候,写入的分别是 '1'、'2'两个字符以及 '2'、'.'、 '3'等三个字符的ASCII码值。显然,如果按照二进制方式写的话,在文件中一般 m要占 4个字节、f 要占 8 个字节

 

 

转载地址  http://liufabin66688.blog.163.com/blog/static/1396854820081027103133373/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值