fwrite()函数和fread()函数的功能分别是将数据从内存中写入文件和从文件中读入内存。灵活运用这两个函数,可以在到很多地方发挥作用,如游戏存档、保存程序中间结果等。下面结合两个程序解释下这两个函数,是个人的理解,如有理解错误的地方,或者还有其他的功能,请大家留言指正,谢谢。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
两个函数的参数列表基本一致。第一参数是指要写入的或者要读入到的指针,第二个参数是指每次写入或读出的大小,第三个指的是写入或读出的大小,第四个指的是写入或读出的文件流。
下面贴出来两端程序:
/*----write.c----*/
#include <stdlib.h>
#include <stdio.h>
int main()
{
int * a;
float b;
double * c;
int i;
FILE * f;
a = (int *) malloc(5*sizeof(int));
b = 2.f;
c = (double *) malloc (10*sizeof(double));
for(i=0;i<5;i++)
{
a[i]=i;
}
for(i=0;i<10;i++)
{
c[i]=99.;
}
f=fopen("content.dat","ab");
fwrite(a,5*sizeof(int),1,f);
fwrite(&b,sizeof(float),1,f);
fwrite(c,10*sizeof(double),1,f);
fclose(f);
return 0;
}
这段代码的意思是,将一个大小为5的int数组、一个float、一个大小为10的double数组依次写入content.dat中。为了达到这个目的,fopen中的模式为“ab”,即append+binary模式。
/*----read.c----*/
#include <stdlib.h>
#include <stdio.h>
int main()
{
int * a;
float b;
double * c;
int i;
FILE * f;
a = (int *) malloc(5*sizeof(int));
c = (double *) malloc (10*sizeof(double));
f=fopen("content.dat","rb");
fread(a,5*sizeof(int),1,f);
fread(&b,sizeof(float),1,f);
fread(c,10*sizeof(double),1,f);
for(i=0;i<5;i++)
{
printf("a[%d]=%d ",i,a[i]);
}
printf("\n");
printf("b=%f\n",b);
for(i=0;i<10;i++)
{
printf("c[%d]=%f ",i,c[i]);
}
printf("\n");
fclose(f);
return 0;
}
这段代码的意思是,将content.dat中的内容,按照写入的顺序依次读出,分别写入分配好的内存中间。然后打印出来,检查结果是否是存入时候的内容。结果输出时这样子的:
a[0]=0 a[1]=1 a[2]=2 a[3]=3 a[4]=4
b=2.000000
c[0]=99.000000 c[1]=99.000000 c[2]=99.000000 c[3]=99.000000 c[4]=99.000000 c[5]=99.000000 c[6]=99.000000 c[7]=99.000000 c[8]=99.000000 c[9]=99.000000
说明结果是正确的。这两个程序就是验证内存的保存和恢复。这里需要注意的是,写入的顺序和读出的顺序必须对应,并且大小和类型必须一致,不然就得不到正确的结果了。本人曾经用JAVA将对象写入文件过,相信底层也是用C中的fwrite()、fread()实现的吧。