首页 > C > 文件 阅读:57,774

结构体的文件读写更新

< 上一页 文件相关操作 二进制与位运算 下一页 >

首先定义下面这样一个结构体:

#define MAXLEN 64

typedef struct _record

{

    char name[MAXLEN];

    int age;

}record,*precord;

record  r =  {“tom”,25};

要将结构体变量r中的数据写入文件,可以按照下面的方法直接写入:

fwrite(&r,sizeof(r),1,fp);

当时,这样写入,会导致结构体中成员name[MAXLEN]中大量的零被写入,导致文件中存放了很多无用的数据零。所以,这样直接写入不是最佳方法。

于是可以考虑将这个结构体按照如下格式写入文件:

假如name[MAXLEN]中的有效字符个数为len,那么写入方法为:

Len+name+age

也就是先将name的字符数len写入文件,接着写入name的有效字符数据,再写入年龄数据。其中lenage各为4个字节的整数,name为字符。比如对于下面结构体记录数据:

record  r1  =  {“tom”,25};

record  r2  =  {“lily”,22};

 

3”tom”25 4”lily”22

这样在每个name前面都用一个长度来记录name中字符的个数,就可以避免将过多的无用的零写入文件了。

下面是实现这种方式写入和读出数据方法的代码:

 

int opt_write_file(FILE *fp)

{

         char ch;

         do

         {

                   record rcd={0};

                   printf("Please input name and age\n");

                   scanf_s("%s%d", rcd.name,MAXLEN,&rcd.age);

                   size_t len = strlen(rcd.name);

                   fwrite(&len,sizeof(len),1,fp);//先写入name中字符的个数

                   fwrite(rcd.name,len,1,fp);//接着写入name字符数

                   fwrite(&rcd.age,sizeof(int),1,fp);//再写入年龄

                   printf("input q to quit,else to continue\n");

                   //scanf_s("%c",&ch,1);

                   //fflush(stdin);

                   ch = _getch();

                   if(ch=='q')

                            break;

 

         } while (1);

         return 0;

}

int opt_read_file(FILE *fp)

{

         while(!feof(fp))

         {

                   record rcd = {0};

                   size_t len=0;

                   int res = fread(&len,sizeof(len),1,fp);//先读取name的字符数

                   if(res == 0)

                   {

                            return 0;

                   }

                   fread(rcd.name,len,1,fp);//再按照字符数读取name

                   fread(&rcd.age,sizeof(rcd.age),1,fp);//再读取年龄

                   printf("name:%s,age:%d,res:%d\n", rcd.name,rcd.age,res);

         }

         return 0;

}

< 上一页 文件相关操作 二进制与位运算 下一页 >

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注