C文件操作
一、 C文件的缓冲文件系统
它是指系统自动地在内存区为每一具下在使用的文件开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存的缓冲区,
装满缓冲区后才一起送到磁盘去。如果从磁盘向向内存读入数据,则一次从磁盘文件将一批数据输入到六味地黄缓冲区(充满缓冲区),
然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。
所以,要用fclose函数关闭文件,可以避免这个问题(当数据没有充满缓冲区而程序结束运行,就会 将缓冲区的数据丢失)
它先把缓冲区中的数据输出到磁盘文件,然后才释放文件指针变量。
二、
1)
文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。
文件通常分为二进制文件和文本文件。
2)、
二进制文件是包含在 ASCII及扩展ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。
3)、
文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件。它是以“行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。
例:
如果一个整数10000,在内存中占2个字节,如果按ASCII码形式输出,则占5个字节,面按二进制形式输出,在磁盘上只占2个字节。
当代码如下时:
FILE *pFile =fopen("2.txt","w");
char ch[3];
ch[0]='a';
ch[1]=10;
ch[2]='b';
fwrite(ch,1,3,pFile);
fclose(pFile);
文件大小为4 个字节
而改为二进制形式输出时,文件大小为3个字节。如下:
FILE *pFile =fopen("2.txt","wb");
char ch[3];
ch[0]='a';
ch[1]=10;
ch[2]='b';
fwrite(ch,1,3,pFile);
fclose(pFile);
文本方式和二进制方式
1)、
当我们按照文本方式往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13、10)。
在读取文件时,一旦遇到回车-换行的组合(即连续的ASCII 13、10),则会转换为换行字符(ASCII为10)。
2)、
当我们按照二进制方式往文件中写入数据,则将数据在内存中的存储形式原样输出到文件中。
问题
给你一个整数,例如:98341,将这个整数保存到文件中,要求在以记事本程序打开文件时,显示的是98341。如下图所示:
显然不能直接输入到文本上,如下:
FILE *pFile =fopen("3.txt","w");
int i = 98341;
fwrite(&i,sizeof(i),1,pFile);
fclose(pFile);
这样的话会出现乱码,原因:
这实际上就是数据在计算机内存当中的表示形式,换到外部的存储介质上
的另一种的存放形式。
我们所存放的整数在内存当中占有四个字节,(十六进制表示),当我们以记事本的方式打开
这一文件,并没有看到98341,它需要把所所存放的每一个数据都要作为ASCIIn码转换为
相应的字符,但它每一个字节数据转换为字符之后,又是不可读的,所以就看到乱码。
应该换一种表达方式:
FILE *pFile =fopen("3.txt","w");
char ch[5];
ch[0]=9+48;
ch[1]=8+48;
ch[2]=3+48;
ch[3]=4+48;
ch[4]=1+48;
fwrite(ch,sizeof(char),5,pFile);
fclose(pFile);