前面对通讯录进行的修改,已经使通讯录有了动态扩容的能力,但是还有另一个很大的问题就是,我们输入通讯录的数据是储存于内存中的,当程序运行结束后,程序所申请的内存空间也将被收回,因而联系人数据会丢失,那么如何将数据存储到磁盘当中呢?
这就要依靠库函数里关于文件操作的函数了。
首先,在关闭通讯录前,要将通讯录里的数据存入磁盘
case 0://退出
system("cls");
save_contact(&con);//保存通讯录到磁盘
destroy_contact(&con);
printf("已退出\n");
break;
void save_contact(Contact* pc)
{
FILE* pf = fopen("contact.txt", "wb");
if (pf == NULL)//判断是否打开成功
{
perror("save_contact::fopen");
return;
}
int i = 0;
for (i = 0; i < pc->sz; i++)
{
fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
}
printf("保存成功\n");
fclose(pf);
pf = NULL;
}
再然后,既然我们存储了数据,那么就还要对数据进行读取,读取应该在函数初期进行
void load_contact(Contact* pc)
{
FILE* pf = fopen("contact.txt", "rb");
if (pf == NULL)
{
perror("load_contact::fopen");
return;
}
PeoInfo tmp = { 0 };
int i = 0;
while (fread(&tmp, sizeof(PeoInfo), 1, pf))
{
check_capacity(pc);
pc->data[i] = tmp;
pc->sz++;
i++;
}
printf("加载通讯录成功\n");
fclose(pf);
pf = NULL;
}
void init_contact(Contact* pc)//动态
{
assert(pc);
pc->sz = 0;
PeoInfo* ptr = (PeoInfo*)calloc(CAP_NUM, sizeof(PeoInfo));
if (ptr == NULL)
{
perror("init_contact::calloc");
return;
}
pc->data = ptr;
pc->capacity = CAP_NUM;
load_contact(pc);
}
这样就有了能使用的通讯录3.0了。