文件的本质
文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。文件通常分为二进制文件和文本文件。二进制文件是包含在ASCⅡ及扩展ASCⅡ字符中编写的数据或程序指令的文件,一般是可执行程序、图形、图像、声音等文件。文本文件(也称为ASCⅡ文件):它的每一个字节存放的是可表示为一个字符的ASCⅡ代码的文件,它是以“行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。
虽然文件分为二进制文件和文本文件,但实际上它们都是以二进制数据的方式存储:文件只是计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。对于文本文件来说,它只是一种特殊形式的文件,它所存放的每一个字节都可以转换为一个可读的字符。
当按照文本方式向文件中写入数据时,一旦遇到“换行”字符(ASCⅡ码为10),则会转换为“回车—换行”(ASCⅡ码分别为13、10)。在读取文件时,一旦遇到“回车—换行”的组合(连续的ASCⅡ码为13、10),则会转换为换行字符(ASCⅡ码为10)。当按照二进制方式向文件中写入数据时,则会将数据在内存中的存储形式原样输出到文件中。
由于文本方式和二进制方式在读取和写入文件时的差异,所以在写入和读取文件时要保持一致。如果采用文本方式写入,应采用文本方式读取;如果采用二进制方式写入数据,在读取时也应采用二进制方式,否则会出现问题。例如位图文件可能有多个13、10组合,如果以二进制方式读取的话,不会有问题,但是如果以文本方式读取的话,就会把这些组合转换为换行符:10,从而导致位图数据的丢失。不管文本文件,还是二进制文件,如果统一采用二进制方式进行写入和读取,则不会出错,因为这种读取和写入是严格按照一个字节一个字节地进行的。
一定要注意文本文件和二进制文件、文本方式和二进制方式之间的差别,不要混淆。不管是文本文件还是二进制文件,都可以采用二进制方式或文本方式打开,然后进行写入或读取,但是对于二进制文件来说,如果以文本方式读取时,可能会出现一些问题。
以上几段摘自孙鑫《VC++深入详解》,帮助读者深入了解文本文件和二进制文件的差别。以下为本人的原创。
数字计算机中只能存储和处理数字信息,而数字信息在本质上是一系列二进制编码。图像、视频、声音、可执行程序、文本等文件,就是以二进制的形式存储在内存或磁盘中,如常用的图像格式jpg、视频格式rmvb、可执行程序exe、文格式txt等。在约定的数据格式下,按照约定保存和翻译二进制数据,即还原了各种信息。
以最简单、基础的文本格式txt为例,它是以“行”为基本结构的一种信息组织和存储方式的文件,其每一个字节存放的是可表示为一个字符的ASCⅡ代码。字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,一个字节等于8位二进制数。在ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。例如字符’a’在磁盘文件中,保存的是97,因为字符’a’的ASCⅡ码为97。在一个文本文件“file.txt”中写入字符’a’并保存,然后关闭文件。下次用记事本程序打开“file.txt”文件时,当程序读到97时,会自动将其按文本信息的规则翻译为字符’a’,这就是文件存储的本质。
理解了以上内容之后,我们自己也可以定义文件格式。比如要在磁盘文件中存储一个圆,圆的基本信息包括圆心和半径,则我们只要把圆心坐标和半径大小存储在磁盘文件即可。下次通过程序打开存储文件时,按照约定格式将圆心坐标和半径翻译过来,即可还原一个圆。具体一点,可将圆心坐标定义为CPoint类型,半径定义为int类型存储起来,打开文件的时候将CPoint类型译成圆心坐标,int类型译为半径。
因此要复制一个文件,不管任何格式,只要读取其在磁盘中的二进制数据并原样复制即可。
举例:往一个文本文件中写入整数12345。实际上文件中保存的是字符’1’、’2’、’3’、’4’、’5’的ASCⅡ码49、50、51、52、53。
查看文件属性,可以看到文件的大小为5个字节,这是因为文件中存储的是5个字符,而每一个字符占1个字节,因此文件的大小为5个字节。若将整数12345以int型(整型)方式存储,则占4个字节(64位的操作系统)或2个字节(32位的操作系统)。可见对整型数而言,以int型方式存储更节省磁盘空间。若以字符形式来存储整型数(int)或浮点型数(float或double),本来一个字符可表示的范围为0~255,但此时却只能表示字符0~9及小数点’.’,共11个字符,浪费了大量的空间。因此以文本方式来保存数值较整型 (int)、浮点型 (float或double)更占用磁盘空间。
---------------------
原文:https://blog.csdn.net/fanghb_1984/article/details/7657114