结构体的文件读写更新
首先定义下面这样一个结构体:
#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的有效字符数据,再写入年龄数据。其中len和age各为4个字节的整数,name为字符。比如对于下面结构体记录数据:
record r1 = {“tom”,25};
record r2 = {“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;
}