我们只需要完成两个函数的添加就可以
1. 添加一个函数,在退出通讯录的时候把信息到保存到文件中
2. 添加一个函数,在通讯录打开的时候,可以把文件中的信息加载到通讯录中
void Save(struct Contact* pc)
{
//打开文件
FILE* pf = fopen("data.txt","wb");//wb是以二进制形式写入文件
//判断是否打开成功
if (pf==NULL)
{
perror("Save::fopen");
return;
}
//写文件
int i = 0;
for (i = 0; i < pc->sz;i++)
{
fwrite(pc->data + i, sizeof(struct PeoInfo),1,pf);
}
//关闭文件
fclose(pf);
pf = NULL;
}
第一个参数: 指向要写入的元素数组的指针,转换为常量
第二个参数:要写入的每个元素的大小(以字节为单位)
第三个参数:每次写入的元素个数
第四个参数:指向指定输出流的 FILE 对象的指针
我们是以二进制形式写入和读的所以这里面的东西我们都看不懂,没关系,计算机看的懂就可以
接下来我们来写加载函数
void LoadContact(struct Contact* pc)
{
//打开文件
FILE* pfr = fopen("data.txt", "rb");
if (pfr==NULL)
{
perror("LoadContact::fopen");
return;
}
//读文件
struct PeoInfo tmp = { 0 };
while (fread(&tmp,sizeof(struct PeoInfo),1,pfr))
{
//要考虑增容问题,不增容只能显示三个
check_capacity(pc);
pc->data[pc->sz] = tmp;
pc->sz++;
}
//关闭文件
fclose(pfr);
pfr = NULL;
}
fread函数和fwrite非常相似自己去查一下就可以
我们创建一个结构体tmp,把信息读到tmp里,再把tmp赋给pc->data[pc->sz].
这样我们再次直接运行程序时数据就不会丢失
他会直接显示增容成功 。
有不懂的可以私信我,我们可以交流一下。