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

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


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


文件分为两类:文本文件,二进制文件。
文件在计算机中存储的信息是由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的实际值而已。而后面的数字,是对应的字符串映射到内存中,再由内存中保存的内容写入在文件里,因此,这一串字符串是我们能够读懂的,当然也就清楚的说明了,为什么,打开一个二进制文件时,我们可以看到一些,我们能够看得懂的内容。


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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值