文本文件和二进制文件

一、介绍

对于文本文件和二进制文件,两者在本质上没有什么不同,它们在内存中都是以二进制形式存储的,也就是都是以01序列存储的,或者说文本文件就是二进制文件的一个特殊分支。

在物理上它们是没有什么区别的,在C语言中对它们两个的操作方式可能有什么区别:

在对文本文件操作时我们一般使用fputc,fgetc、fputs、fgets,fprintf、fscanf等函数,二对于二进制文件操作时,我们一般使用fwrite、fread函数。另外对于打开文件的模式也有一些区别,打开文本文件时一般是"w","r"等模式,而在打开二进制文件时,则是"wb","rb"等模式。

那为什么人们经常讲文本文件和二进制文件并列提出呢,这可能就是因为文本文件太特殊了吧,文本文件的解码方式是大致确定的(如UTF-8、ASCII),ASCII的编码是定长的;而对于其他二进制文件编码是变长的,例如有些二进制文件就可以直接存储short、int等类型数据,short 类型可能占用 2 个字节,int 和 float 类型通常占用 4 个字节,所以这里的编码是变长的,需要知道具体布局才能解码。

1、简要介绍

数据在内存中以二进制的形式存储,如果不加转换的输出到外存(例如硬盘驱动器HDD、固态驱动器SSD),就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

以读文件为例, 两者的操作都是磁盘->文件缓冲区->应用程序内存空间

  1. 磁盘到文件缓冲区:在这一阶段,数据以二进制形式从存储介质传输到文件缓冲区,这一过程对于文本文件和二进制文件是相同的。操作系统并不关心文件的具体内容是文本还是其他类型的数据。

  2. 文件缓冲区到应用程序内存空间:这一阶段涉及到数据的解释,不同的应用程序将以不同的方式处理这些数据。

    • 文本文件:应用程序(比如文本编辑器)通常会根据文本的编码(如UTF-8、ASCII)来解释这些二进制数据为人类可读的字符。这里没有额外的控制信息,仅仅是字符数据。
    • 二进制文件:需要特定的应用程序来正确解析和展示文件内容,如如图片查看器对于*.bmp类型文件、媒体播放器对于*.MP4类型的文件,或专有格式解析工具。二进制文件可能包含复杂的数据结构,如文件头信息、元数据、实际数据和可能的文件结束标记等。

所以这里的区别就在第二步上面。

可以发现,实际上文本文件就是特殊的二进制文件,甚至可以说,文本文件是和*.bmp等二进制文件同级的,也就是文本文件也是属于二进制文件,只不过它比较特殊,因为文本文件的解码方式是大致确定的(如UTF-8、ASCII)。

而对于文本文件的打开方式(或者说解码平台)也是确定的,就是文本编辑器(例如记事本),记事本只支持文本文件,用记事本打开二进制文件时会出现乱码的,这就是因为编码和解码的方式不同所导致的。当你用文本编辑器打开一个二进制文件时,由于文本编辑器试图将所有二进制数据解释为字符,你可能会看到一堆乱码。这是因为二进制文件中的很多二进制序列并不对应于有效的字符编码,或者按照文本文件的解析逻辑不会形成有意义的输出。

2、例子

这里是小段字节序。

1)使用文本编辑器打开二进制文件:

我们可以使用以下代码来测试上面的例子:

#include <stdio.h>

int main()
{
	FILE* pf = fopen("test.bin","wb");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}

	int num = 10000;
	fwrite(&num, 4, 1, pf);//写入数据

	fclose(pf);
	pf = NULL;
	return 0;
}

在运行后,会产生一个test.bin的文件,然后我们使用记事本来打开这个文件,可以看到:

因为DLE(一种控制字符)是不可显示的,所以前面有个,这个是代表不可显示的字符的,在我反选内容后,发现后面还有两个字符位置,但是没有什么字符,实际上就是NULL,NULL也可解释成字符'\0',所以这与我们分析的一致,也就是:

2)使用二进制编辑器打开二进制文件:

当我们使用二进制编辑器打开刚才的文件后:

因为这里是小端字节序,转化为正常顺序是:

00 00 27 10

又因为这里是十六进制显示,转换为十进制为:

可以得到原始数据10000。

3、总结

通过上面的例子我们不难发现文本文件与二进制文件的不同包含:

  1. 能存储的数据类型不同

    • 文本文件:主要用于存储字符数据。它们将数据存储为人类可读的文本格式。即使存储的是数字,这些数字也是以字符的形式存储,例如,数字 123 会存储为字符 '1'、'2'、'3'。这意味着文本文件主要用于存储那些可以直接转换为文本的数据。
    • 二进制文件:可以存储各种类型的数据,包括 charintshortlongfloatdouble 等。这些数据以内存中的原始二进制格式存储,不仅限于文本数据。因此,二进制文件可以用来高效地存储和读取复杂的数据结构和对象。
  2. 每条数据的长度

    • 文本文件:在使用如 ASCII 或 UTF-8 编码时,大多数基本字符(如英文字母和数字)占用固定大小的空间(例如,ASCII 编码下每个字符占用 1 个字节)。但是,使用某些编码(如 UTF-8)时,某些字符可能会占用多个字节。尽管如此,文本文件中的数据通常被视为由一系列字符组成,每个字符的大小可能是固定的(在特定编码下)。
    • 二进制文件:存储的数据长度可以变化,取决于数据类型。例如,short 类型可能占用 2 个字节,int 和 float 类型通常占用 4 个字节,long 和 double 类型可能占用 8 个字节(这些大小可能根据不同的系统和编译器有所不同)。这种存储方式使得二进制文件能够有效地存储各种类型的数据,但同时也意味着读取这些文件需要知道数据的确切布局和类型。

对于读取这些二进制文件需要知道数据的确切布局和类型。就例如上面的例子,在使用二进制编辑器打开test.bin文件后,我们可以看到 10 27 00 00 这个序列,然后我们可以分析出这是之前我们写入的 int 型数据 10000 ,这也是因为我们知道数据的布局和类型,因为我们知道这里的数据是小端字节序,所以才将这个序列转换为正常的顺序 00 00 27 10 ,然后我们知道这里是 int 型数据,所以我们才将这四个字节数据一起解释为 10000 ,这才得到了原始数据。

假设我们这里不知道是小端字节序,只知道这里是 int 型数据,当成了大端字节序,就会被解释成:

这与原始数据天差地别。

假设我们这里不知道这里的布局是一个 int 型数据,只知道是小端字节序,当成了两个 short 型数据,就会被解释成:

0和10000两个数据,这就与原始数据背道而驰。

所以说对于读取这些二进制文件需要知道数据的确切布局和类型。

4、扩展

文件的后缀名可以提供一定的信息关于文件的类型和预期的处理方式,但它并不总是准确地反映文件的内部结构或数据布局。后缀名更多的是一种约定,帮助操作系统和用户识别和关联相应的程序来打开这些文件。例如,.exe 后缀名的文件通常是可执行文件,在Windows操作系统中用来标识包含可执行程序的二进制文件。

然而,仅凭后缀名并不能完全确定文件的内容。例如,一个文件可能有一个.txt的后缀名,但实际上包含的是随机的二进制数据。同样,一个文件可能没有后缀名或者后缀名被错误地标记,但内容仍然是有效的特定类型的数据。

对于二进制文件,了解文件的确切数据布局和类型通常需要更多的信息,这可能来自于文件本身的元数据、开发文档、或特定的文件解析工具。例如,图像文件如.jpg.png,虽然后缀名提供了文件类型的信息,但具体的图像尺寸、颜色深度和压缩类型等信息需要通过解析文件头部的元数据来获取。

这里以bmp文件为例,BMP(位图)是一种非常直接,原始的图像文件格式,常用于Windows操作系统中。它包含了图像的像素数据以及描述这些数据如何显示的元数据。BMP 文件由四个部分组成:位图文件头、位图信息头、色彩表(可选)以及位图像素数据。

  1. 位图文件头(Bitmap File Header):这部分总共有 14 个字节。它包含了文件类型信息(2个字节,通常为 "BM" 表明是BMP格式)、文件大小(4个字节)、保留字(2个字节+2个字节,通常为0)和偏移量(4个字节,表示从文件头到实际的位图数据的字节)。

  2. 位图信息头(Bitmap Info Header):这部分包含了图片的尺寸、颜色以及打印信息等。最常用的版本是40字节长,包含了图像的宽度和高度(各4个字节)、颜色平面数(2个字节,通常为1)、每个像素位数(2个字节,如24表示24位色,即全彩色)、压缩类型(4个字节,0表示不压缩),还有其他一些关于图像的信息,如实际图像大小、目标打印分辨率等。

  3. 色彩表(Color Table):这部分是可选的,存在于使用索引颜色(如256色)的 BMP 文件中。每个条目4个字节,分别为蓝、绿、红和保留字。条目数量由位图信息头中的颜色数决定。

  4. 像素数据(Pixel Data):这是文件中最大的一个部分,包含了图像的实际像素数据。数据是从位图的左下角开始的,按行排列。每行的字节数必须是4的倍数,不够的部分会用0填充。

值得一提的是,BMP 文件格式没有内置的压缩机制(虽然位图信息头有一个“压缩类型”的字段,但在大多数情况下,这个字段的值为0,表示不压缩),所以 BMP 文件通常比其他格式(如 JPEG 或 PNG)的图像文件大得多。

总结来说,文件的后缀名提供了一个基本的指示,但对于精确处理和理解二进制文件的内容,通常需要依赖于文件规范的详细文档或专用的解析工具。

二、文本文件和二进制文件的优缺点

1、文本文件

优点

  1. 人类可读性:文本文件可以直接用文本编辑器打开,内容对人类是可读的。这使得调试和编辑文件内容比较简单直接。
  2. 兼容性:文本文件格式通常跨平台兼容,不同的操作系统和程序都能够处理文本文件。
  3. 格式简单:文本文件通常有简单的结构,如CSV(逗号分隔值)格式,可以轻松被多种编程语言和应用程序读取和写入。
  4. 编辑方便:可以使用任何基本的文本编辑器对其进行编辑修改,无需特殊软件。

缺点

  1. 效率低:文本文件通常需要更多的存储空间,因为它们将所有数据存储为字符。例如,一个整数值 1234 在文本文件中可能占据 4 个字节,而在二进制文件中只需占用通常的 2 或 4 个字节。
  2. 处理速度慢:解析文本文件(如将数字字符串转换为数字类型)通常需要更多的处理时间。
  3. 不支持复杂数据结构:文本文件不适合存储复杂的数据结构如对象或多维数组,除非进行某种形式的序列化,这可能增加处理的复杂性。

2、二进制文件

优点

  1. 存储效率高:二进制文件直接以内存中的格式存储数据,通常占用更少的空间。
  2. 处理速度快:由于数据以其原生格式存储,读写操作通常比处理文本文件要快,不需要转换步骤。
  3. 支持复杂数据结构:二进制文件可以方便地存储复杂的数据结构,如多维数组和对象。
  4. 安全性和隐私性:二进制文件不易被人直接理解,可以提供一定程度的数据隐藏和保护。

缺点

  1. 不可读性:二进制文件的内容不可直接阅读,需要特定的程序或者开发者工具来解析和查看。
  2. 平台依赖性:不同的系统架构可能会对二进制数据的表示(如字节顺序)有不同的处理方式,这可能导致二进制文件在不同平台间的兼容问题。
  3. 文件损坏的风险:二进制文件如果在中间出现损坏,可能整个文件都无法使用,因为没有明确的分隔符来重新同步数据流。

三、文本文件和二进制文件的存取

1、文本文件的读取和存储

读取过程:
  1. 打开文件:应用程序(如记事本)打开文件,获取文件的句柄。
  2. 读取数据:应用程序从文件中读取二进制数据流。
  3. 解码:应用程序按照预设的字符编码(如ASCII、UTF-8等)将二进制数据流解码成字符序列。
  4. 显示内容:应用程序将解码后的字符序列显示在屏幕上。
存储过程:
  1. 打开文件:应用程序打开一个新文件或现有文件,获取文件的句柄。
  2. 编码:应用程序将用户输入的文本内容按照预设的字符编码转换成二进制数据流。
  3. 写入数据:应用程序将编码后的二进制数据流写入文件。
  4. 关闭文件:完成写入后,应用程序关闭文件。

2、二进制文件的读取和存储

读取过程:
  1. 打开文件:应用程序打开文件,获取文件的句柄。
  2. 读取数据:应用程序从文件中读取二进制数据流。
  3. 解析数据:应用程序根据文件的特定格式(如BMP文件的文件头、信息头和像素数据)解析二进制数据流。
  4. 处理内容:应用程序根据解析后的数据进行相应的处理,如显示图像、播放音频等。
存储过程:
  1. 打开文件:应用程序打开一个新文件或现有文件,获取文件的句柄。
  2. 组织数据:应用程序根据文件的特定格式组织数据,如按照BMP文件的结构组织图像数据。
  3. 写入数据:应用程序将组织好的二进制数据流写入文件。
  4. 关闭文件:完成写入后,应用程序关闭文件。

四、总结

在编程和计算机科学的领域里,文本文件和二进制文件的区别主要在于它们的内容是否符合某种人类可读的文字编码规范。文本文件,如*.txt、*.c、*.cpp等,它们使用标准的字符编码,如ASCII、Unicode或特定语言的编码标准(如GB2312用于简体中文),这使得它们可以被文本编辑器直接打开并以人类可读的形式展现,这些就可以称为文本文件。文本文件的这一特性,使得它们在开发、编辑和交换信息时非常方便,因为它们可以被人直接阅读和修改,而不需要通过特定的程序或解析器。例如,HTML文件定义了网页的结构和内容,可以用任何文本编辑器打开,修改后的内容可以通过浏览器直接查看效果。

相反,二进制文件包含的数据不遵循文字编码规范,或者说它们包含的是编码后的数据,这些数据可能代表文本、图像、音频、视频或其他类型的信息。二进制文件通常需要特定的程序或解析器来读取和理解其内容。例如,JPEG文件需要图像查看器或编辑器来显示图片,MP3文件需要音频播放器来播放音乐。对于那些编码规范只有开发者知道的二进制文件,除非有相应的文档或工具,否则普通用户很难理解文件内容的真正含义。这种情况下,二进制文件对于大多数人来说确实是不透明的,只能通过特定的应用程序来访问和处理这些文件。

然而这些并不能证明文本文件与二进制文件在本质上有什么区别,实际上两者在本质上都是以01序列存储的,只不过文本文件的分布格局是确定的,或者说解码方式是确定的,然而我们所说的二进制文件的种类很多,例如.png、.bmp等文件,它们的分布格局是不确定的,假如说你开发了一个新的文件类型,只有你知道这个文件的布局,别人就很难获取这个文件具体要表达的内容,但是它在内存中存储的也是01序列,所以说它也可以说是二进制文件,从这里也可以发现,文本文件实际上就是一种特殊的二进制文件。

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值