fwrite()、fread()函数使用小结

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()实现的吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值