我们已经实现了静态版本和动态增长的通讯录,动态增长的通讯录解决了内存问题,但是这俩种通讯录都是只有在程序的一次运行中数据存在,当我们关闭程序,重新运行时,之前存入通讯录中的数据都已经销毁了,为了使通讯录中的数据持久化,我们可以将通讯录中的联系人存放到文件中,这样当我们重新运行程序时,只要能实现从文件中导入联系人信息,就能查看之前存放的联系人信息:
基于动态增长版本的通讯录,我们只需要实现两个功能:
1️⃣ 在退出通讯录的时候把信息到保存到文件中
2️⃣在通讯录打开的时候,可以把文件中的信息加载到通讯录中
把信息到保存到文件中
void SaveContact(Contact* pcon)
{
int i = 0;
FILE* pfWrite = fopen("contact.dat", "wb");
if(pfWrite == NULL)
{
printf("保存信息:打开文件失败\n");
return;
}
//保存信息
for(i=0; i<pcon->sz; i++)
{
fwrite(pcon->data+i, sizeof(PeoInfo), 1, pfWrite);
}
//关闭文件
fclose(pfWrite);
pfWrite = NULL;
}
把文件中的信息加载到通讯录中
void LoadContact(Contact* pcon)
{
PeoInfo tmp = {0};
FILE* pfRead = fopen("contact.dat", "rb");
if(pfRead == NULL)
{
printf("加载信息:打开文件失败\n");
return;
}
//加载信息
while(fread(&tmp, sizeof(PeoInfo), 1, pfRead))
{
CheckCapacity(pcon);
pcon->data[pcon->sz] = tmp;
pcon->sz++;
}
fclose(pfRead);
pfRead = NULL;
}
把文件中的信息加载到通讯录中这一步添加到通讯录初始化函数中即可
void InitContact(Contact* pcon)
{
assert(pcon);
pcon->sz = 0;
pcon->data = (PeoInfo *)calloc(DEFAULT_SZ, sizeof(PeoInfo));
if(pcon->data == NULL)
{
printf("%s\n", strerror(errno));
return;
}
pcon->capacity = DEFAULT_SZ;
LoadContact(pcon); //初始化时直接读取
}
完整代码:Project_23_4_21/Project_23_4_21 · 李斯啦果/我的代码 - 码云 - 开源中国 (gitee.com)