二进制文件和文本文件读取的区别小议

在学习了文件的输入和输出之后,本人一直存在一个疑问,我想可能也是好多人的疑问。那就是二进制文件和文本文件中的内容到底是怎么读写的?我们为什么打开二进制文件看到的是一些乱码?


由于今天的时间充足,编找了一点相关资料,并总结了一下。


文件分为两类:文本文件,二进制文件。
文件在计算机中存储的信息是由1或0表示的,所以按照严格意义来说,两者不存在根本区别。
但是两者之间又有区别:
个人认为,他们最大的区别是文本文件属于字符编码,而二进制文件属于字符串编码。


下面我们看个例子:


#include<stdio.h>

int main(void)
{
	int num = 52761;
	char c[6] = "52761";
	FILE *fp;
	int *p;

	if((fp = fopen("txt.txt","w")) == NULL)
	{
		fprintf(stderr,"can't open txt.txt.\n");
		exit(1);
	}
	p = #
	fprintf(fp,"%s\n","52761");
	fprintf(fp,"%d\n",*p);
	fclose(fp);

	if((fp = fopen("binary","wb")) == NULL)
	{
		fprintf(stderr,"can't open binary.\n");
		exit(1);
	}
	fwrite(p, sizeof(int), 1, fp);
	fwrite(c,sizeof(c),sizeof(c)/sizeof(char),fp);
	fclose(fp);

	return 0;
}

接下来,我在win7的操作系统32位机的环境下,我用UltraEdit分别查看txt.txt和binary两个文件里的内容:
其中txt.txt中存储的内容如下:


相信你已经注意到了,无论我是用十进制格式输出还是字符串格式输出,其存储内容全部都是将各个数字转化为字符进行存储的。但是,仔细的你会发现,怎么每个后面都有0D和0A呢!我们知道,0A代表‘\n’,我们在输出的时候都加了‘\n’,所以有他便不足为奇了,但是怎么又有0D呢!
下面我就摘抄一段《c primer plus》(第五版  355页)里的一段话,帮助大家理解:ANSI 要求提供的两种文件视图是文件视图和二进制视图。在二进制视图中,文件的每个字节都可以为程序所访问。在文本视图中,程序看到的内容和文件的内容有可能不同。例如,使用文本视图读取文件时,将吧行尾的本地环境表示法映射为c视图。与之类似,在输出的时候,也会将c视图中的行尾表示映射为本地环境表示法。例如,MS-DOS文本文件用回车符合换行符的组合\r\n来表示行尾。Macintosh文本文件只用一个回车\r来表示行尾。c程序使用一个\n表示行尾。所以,如果c程序以文本视图模式处理一个MS-DOS文本文件,在读取文件时,它会将\r\n转化为\n,在写入文件的时候,它会将\n转化为\r\n;而对于Macintosh文本文件的文本视图,读取文件时它会将\r转化为\n,在写入文件的时候他会将\n转化为\r。看到这,我相信,你就不难理解为什么还出现\r了。

binary中存储的内容如下:


接下来,我们再看看二进制文件中的存储内容。如你所见19 CE所对应的内容正好是我们所不懂的,且称之为乱码的内容。其实 19 CE就是52761的实际值而已。而后面的数字,是对应的字符串映射到内存中,再由内存中保存的内容写入在文件里,因此,这一串字符串是我们能够读懂的,当然也就清楚的说明了,为什么,打开一个二进制文件时,我们可以看到一些,我们能够看得懂的内容。


总结:从这,我们可以这样想,其实,在你存储文件时,操作系统并不会让你每输入一个值就写到文件中(不然多次进行内部设备与外部设备之间的轮换读取,这效率也太低了),而是会给你分配一段缓冲区,二进制文件就是讲缓冲区的内容原封不动的放进文件;文本文件却是在你每一次输入之后,将你输入的值转换为对应的编码值再存放在文件中。在这,我们也可以看出处理两文件是的效率问题了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章