700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 文本文件与二进制文件的区别

文本文件与二进制文件的区别

时间:2024-02-15 20:24:26

相关推荐

文本文件与二进制文件的区别

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

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

计算机以二进制数字0和1存储数据,因此在物理层面上,文本文件和二进制文件没有本质差异,都是由数字0和1构成的集合。

两者的差异体现在编码逻辑。

文本文件是基于字符编码的文件,一般采用定长编码方式,比如ASCII编码、UNICODE编码。其中ASCII编码采用8个特定的比特来表示每一个字符,而UNICODE编码采用16比特。

二进制文件直接由二进制数字0和1组成,不存在统一的字符编码,也就是说由你来决定多少个比特表示一个什么值,你可以根据具体的应用来指定这些比特的含义,类似于自定义编码,而且是不定长度的编码。

比如 bmp文件,它开始的部分是文件头信息,前2个字节表示文件格式为BMP格式,接着的 8个字节表示文件的长度,再接着的4个字节表示 bmp文件头的长度。从中可以看出,解析bmp文件时是不定长度的,2、4、8字节长度的都有。因此bmp文件是二进制文件。

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

打开一个文本文件的过程是怎样的呢?这里以打开某个记事本文件为例进行说明。

文件系统首先读取这个记事本文件所对应的二进制比特流,然后按照你选择的解码方式来解析这个比特流,最后将解析的结果显示出来。

如果你选择ASCII码来解析,那么文件系统会以8比特为单位来解析这个比特流。

比如有一个比特流“01000000010000010100001001000011”,如果按照ASCII码来解码,第一组的8个比特“01000000”对应着字符“A”,其余三组的8个比特分别对应着字符“B”“C”“D”,于是这个比特流就被解析为“ABCD”,因此打开这个记事本时,记事本界面就显示“ABCD”。

注意,记事本无论打开什么类型的文件,都会按照既定的字符编码工作(比如 ASCII码)。因此使用记事本打开二进制文件时,必然会出现乱码,因为解码不正确。比如比特流“00000000000000000000000000000001”,在二进制文件中可能对应着一个四字节长度的整数1,却被记事本解析为"NULLNULLNULLSOH"这四个控制符。

文本文件的存储与读取是逆过程,不再赘述。二进制文件的存取与文本文件的存取类似,两者只是编解码的方式不同,也不再赘述。

三、文本文件与二进制文件的优缺点

文本文件与二进制文件,两者的区别主要体现在编码,因此两者优缺点就是编码的优缺点。

文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。空间利用率方面,二进制文件甚至可以用一个比特来代表一个意思,而文本文件至少使用一个字符来表示一个意思,因此二进制文件的空间利用率比文本文件要高。

很多书上还认为,文本文件的可读性要好一些,但读写时需要转换时间;而二进制文件的可读性差,但读写时不需要转换时间。

可读性是从软件使用者角度来说的。我们使用通用的记事本工具,就几乎可以浏览所有文本文件,所以说文本文件可读性好;读写某个二进制文件需要一个特定的文件解码器,比如读写bmp文件必须使用读图软件,所以说二进制文件可读性差。

读写转换时间是从编程角度来说的。

有些操作系统,比如 windows操作系统,在读写文本文件时,需要进行“\n”和“\r\n”之间的转换:将缓冲区中的数据写入硬盘时,每遇到一个换行符 “\n”(对应着0AH),首先把它转换成回车换行符“\r\n”(对应着0D0AH),也就是把 0AH改为0D0AH,然后再把转换后的数据写入硬盘;将硬盘中的文本文件的数据读取到缓冲区时,每遇到一个回车换行符“\r\n”(对应着 0D0AH),首先把它转换成“\n”(对应着0AH),也就是把0D0AH改为0AH,然后再把转换后的数据送入缓冲区。这个查找与转换的过程需要耗费一定的时间。另外,linux系统读写文本文件不需要进行这样的转换。

所有的操作系统在读写二进制文件时,不需要进行任何转换:将缓冲区中的数据写入硬盘时,直接将数据写入硬盘即可;将硬盘中的二进制文件的数据送入缓冲区时,直接将数据送入缓冲区即可。

四、代码示例

读写文本文件与读写二进制文件,两者没有本质的区别,都是内存缓冲区与硬盘文件比特流之间的交互过程,不同之处在于读写文本文件时,存在换行符“\n”与回车换行符“\r\n”之间的转换。

当内存缓冲区中没有换行符“\n” 时,将缓冲区中的数据写入文本文件,与将缓冲区中的数据写入二进制文件,两者的操作结果是一样的。当硬盘文件中没有回车换行符“\r\n”时,读取文本文件和读取二进制文件,两者的操作结果是一样的。

值得注意的是,这种转换不需要写代码来处理,因为它由操作系统自动完成。

读写文本文件和二进制文件的代码如下所示。

(1)将硬盘中的文本文件读到缓冲区

#define _CRT_SECURE_NO_WARNINGS // 允许使用过时的函数和不安全的函数,去掉警告#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc,char** argv){char file_path[] = "C:\\Users\\Administrator\\Desktop\\aa.txt";FILE *file = fopen(file_path,"r"); // r\w\rwif (file == NULL) //判断一下文件是否为空{printf("当前文件不存在\n");return 0;}char buffer[100]; //定义缓冲区while (fgets(buffer,100,file))//缓冲区首地址,每次读取的长度,源文件{printf("%s",buffer); //打印文件内容,注意这里不加换行符}fclose(file); //关闭文件流getchar(); //若不加这行代码,VS环境下的控制台窗口会一闪而过return 0;}

(2)将缓冲区的数据写入硬盘中

#define _CRT_SECURE_NO_WARNINGS // 允许使用过时的函数和不安全的函数,去掉警告#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc,char** argv){//指定将数据写到哪个文件 char file_path[] = "C:\\Users\\Administrator\\Desktop\\a.txt";//打开该文件,获取该文件的描述符FILE *file = fopen(file_path, "w");//定义缓冲区的内容,即准备把什么内容写到文件中char content[] = "I Have a Dream";//将缓冲区的内容写到文件中//参数1表示写入什么内容,参数2表示(写到哪个文件的)文件的描述符fputs(content,file);fclose(file);getchar();return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。