由于今天的时间充足,编找了一点相关资料,并总结了一下。
文件分为两类:文本文件,二进制文件。
文件在计算机中存储的信息是由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的实际值而已。而后面的数字,是对应的字符串映射到内存中,再由内存中保存的内容写入在文件里,因此,这一串字符串是我们能够读懂的,当然也就清楚的说明了,为什么,打开一个二进制文件时,我们可以看到一些,我们能够看得懂的内容。
总结:从这,我们可以这样想,其实,在你存储文件时,操作系统并不会让你每输入一个值就写到文件中(不然多次进行内部设备与外部设备之间的轮换读取,这效率也太低了),而是会给你分配一段缓冲区,二进制文件就是讲缓冲区的内容原封不动的放进文件;文本文件却是在你每一次输入之后,将你输入的值转换为对应的编码值再存放在文件中。在这,我们也可以看出处理两文件是的效率问题了。