文本文件和二进制文件(感觉没前一个写的好)

二进制文件,这个再基础不过的名词,正因为它的无处不在,或许没有人会关注它背后隐含的内容。其实我也一样,在写下
这些文字之前,我也是认为二进制文件就像空气一样,平常得让人完全忽略了。
        很偶然的,今天在写代码的时候使用了fopen函数:
                 FILE * fopen (const char * filename, const char * mode)
大家可以看到第二个参数是mode,而这个参数定义了文件打开的方式,w、a等都可以做为函数的实参。除此之外,还有两个值:t和

b。这两个值定义了文件是按照文本(text)还是二进制(binary)方式开发。正是这个两个值引起了我对二进制文件的兴趣,因为它们

让我想到了很多问题。
        首先,出现在脑海的第一个问题是:文本文件和二进制文件有什么区别呢?我想这个问题并不是每个程序员能够马上回答

上来的,至少我是不行了。查阅了资料之后,发现答案就在自己的知识范围之内的:将文件看作是由一个一个字节(byte) 组成的,

那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字

节中的所有位都用上了。这就是两者的区别;
        接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是

文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会

进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;
        最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进

行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二

进制文件进行编辑了。

----------------2---------------


二进制文件和文本文件都是0,1组成,但文件系统对他们的解释不一样,一般系统调用(或WIN32API)都会分为字符
式和二进制式(或流式).文本或字符文件代表慢速设备,而二进制文件代表可以大块数据操作的快速外设,二进制文件内容基本无意义

,系统对它不加解释地传给调用者,解释由调用者负责.而对字符文件,系统把他理解为单字节的ASCII或多字节的UNICODE字符串,并且

对其中的特殊字符(如回车等)加以特殊处理.所以同一个文件,可以使用不同类型的系统调用.


文本文件也叫做ASCII码文件,与以‘文本方式’打开文件不是同一个概念!文本文件存储的是ASSCII码字符,即存储在磁盘上只占用二进制的0x20--0x7e。另外,还有回车(0x0d),换行(0x0a),TAB(0x09)等,所以有可压缩的空间。

    换行和回车是不同的,而且在不同的操作系统,解释也不相同。‘/n’一般会操作系统被翻译成"行的结束",即LF(Line-Feed);‘/r’会被翻译成"回车",即CR(Cariage-Return)

    回车(CR)和换行(LF)符都是用来表示“下一行”的。而标准没有规定要使用哪一个。于是产生了三种不同的用法:
(1) Dos和windows采用回车+换行(CR+LG)表示下一行
(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字母的模式是相同的。(UNIX文本文件通常不包含Ctrl+Z和/r)
关于EOF:
    EOF可以作为文本文件的结束标志,但不能作为二进制文件的结束符.feof函数既可以判断二进制文件,又可以判断文本文件.

    EOF在Windows下是ctrl+z,linux下是ctrl+D.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bily1984/archive/2008/10/30/3182035.aspx

 

 

----------------3---------------

文本文件

文本文件是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。 特别的是,文本文件是指以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文件)和二进制文件。如果将存储的信息采用字符串方式来保存,那么称此类文件为文本文件。如果将存储的信息严格按其在内存中的存储形式来保存,则称此类文件为二进制文件。例如下面的一段信息:
“This is 1000”
在C语言中,分别采用字符串和整数来表示,如下:
char szText[]=”This is ”; int a=1000;
其中“This is”为一个字符串,1000为整型数据。如果这两个数据在内存中是连续存放的,则其二进制编码的十六进制形式为:
54 68 69 73 20 69 73 20 00 03 E8 如果将上述信息全部按对应的ASCII编码来存储,则其二进制编码的十六进制形式为: 54 68 69 73 20 69 73 20 00 31 30 30 30
如果上述信息保存到文件中是按
54 68 69 73 20 69 73 20 00 03 E8 形式来存储,则称此文件为二进制文件。如果是按 54 68 69 73 20 69 73 20 00 31 30 30 30 形式来存储,则称此文件为文本文件。
在C语言中,把文件看作一组字符或二进制数据的集合,也称为“数据流”。“数据流”的结束标志为-1,在C语言中,规定文件的结束标志为EOF。EOF为一符号常量,其定义在头文件“stdio.h”中,形式如下:
#define EOF (-1) /* End of file indicator */


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bily1984/archive/2008/10/30/3182041.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值