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

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

计算机以二进制数字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;
}

文本文件与二进制文件的区别相关推荐

  1. 文本文件和二进制文件的区别

    广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名.狭义的二进制文件即除文本文件以外的文件.文本文件是一种由很多行字符构成的计算机文件.文本文件存在于计算机系统中,通常在文本文件最后一 ...

  2. 计算机中,文本文件和二进制文件的区别

    文本文件和二进制文件都是存储的二进制0和1,区别在于: 文本文件:二进制是以字符编码方式存储的,如utf-8, gbk,规则简单 二进制文件:二进制没有以字符编码的方式存储,规则复杂,只有计算机能够理 ...

  3. 文本文件和二进制文件的区别和联系

    目录 文件类型 ASCII码 文本文件和二进制文件 程序       最近使用MATLAB将文本文件转换为二进制文件时遇到了一些麻烦,回头补了补当年学的文件存储,对计算机中文件存储理解更深刻了,在这里 ...

  4. python文本文件和二进制文件的区别_以文本格式和二进制格式打开文件,到底有什么区别?...

    以文本格式和二进制格式打开文件,到底有什么区别? 我们知道,open() 函数第二个参数是一个字符串,用于指定文件的打开方式,如果该字符串中出现 b,则表示以二进制格式打开文件:反之,则以普通的文本格 ...

  5. 【文本文件与二进制文件的区别;文件打开与关闭的方法、不同读写方式】(学习笔记19--文件上)

    目录 文件的打开与关闭 文件的打开 文件的关闭 标准文件流 文件流的重定向 文件的读写 以字符的方式读写文件 以行的方式读写文件 以格式化的方式读写文件 以块的方式读写文件 文件的打开与关闭 文件的实 ...

  6. python中文本文件和二进制文件的区别_文本文件和二进制文件的区别

    定义 广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名.狭义的二进制文件即除文本文件以外的文件.文本文件是一种由很多行字符构成的计算机文件.文本文件存在于计算机系统中,通常在文本文件 ...

  7. python087(文件—文件概念以及文本文件和二进制文件的区别)

    文件的概念和作用 计算机的文件,就是存储某种长期储存设备上的一段数据 长期存储设备包括:硬盘.U盘.移动硬盘.光盘... 文件的作用 将数据长期保存下来,在需要的时候使用 CPU在使用数据时,要先将硬 ...

  8. 117. 请简述文本文件和二进制文件的区别

    链接:https://www.nowcoder.com/questionTerminal/6e2a7411830d44b19b3dd1de7e7302db?toCommentId=1137079 来源 ...

  9. 详解文本文件和二进制文件区别

    转自:https://blog.csdn.net/renyongwang1988/article/details/8050506 网上关于文本文件与二进制文件的文章很多,但遗憾的是,这些文章讲得都比较 ...

最新文章

  1. 有关GetPrivateProfileString的使用方法
  2. 4399积分小游戏_分数提交规则
  3. Ubuntu 安装 JDK 问题
  4. C#使用Xamarin开发可移植移动应用(3.Xamarin.Views控件)附源码
  5. P2714-四元组统计【数论,容斥】
  6. 让你的 Node.js 应用跑得更快的 10 个技巧
  7. 剑指offer(数值的整数次方)
  8. LINUX上安装openjdk
  9. 五款常见的bt磁力下载软件
  10. win10系统可以登录微信,但浏览器不能打开网页
  11. 十二星座的来历和希腊神话12主神简介
  12. 计算机管理 未分配磁盘,win7系统对未分配磁盘空间进行分区的操作方法
  13. Matlab 导入并显示png格式的透明图片
  14. a标签中herf的用法
  15. vue中对token的有效期的理解
  16. 不同网段之间访问网上邻居的方法
  17. Xrm.Utility.openEntityForm的使用
  18. 常识-java发送邮件函数+开启qq邮箱授权码
  19. 打破思维断层之KMP分析 - wsc - ITeye技术网站
  20. Java基础(一)Java语言概述及入门

热门文章

  1. 如何搭建一个好的知识库管理系统?
  2. Java中 POI读取Excel工具类
  3. 2022年施工员-装饰方向-通用基础(施工员)考试题库及施工员-装饰方向-通用基础(施工员)证考试
  4. vscode设置2个空格的缩进
  5. 新农业@2022:人、平台和技术
  6. python爬虫,站长之家
  7. sonarqube连mysql_sonarqube接入mysql数据库实例
  8. Pytorch随记(3)
  9. Maya 2012 下载 及 汉化包
  10. 手把手教你matlab完成三相永磁同步电机电压饱和函数function实现