在前两篇对通讯录以静态数组和动态数组的形式实现以后,还想要对该项目进一步优化。想把之前输入过的联系人信息存下来,在下次需要打开时,直接读取之前的文件即可,不需要再次输入重复的信息。
本次优化的点在于,文件的加载和存档:
- 文件加载:在初始化阶段完成。
- 文件存档:在退出程序时完成。(退出异常时可能导致存档失败)
因为大部分代码都是相同的,所以本篇博客并不将所有的代码附上,若有需要,可以点击下面的链接查看:
静态数组实现
动态数组实现
在此只将优化的部分代码附上:
static void Save(pContact pCon)
{
int i = 0;
FILE *fp = NULL;
assert(pCon);
fp = fopen("PeoInfo.dat", "wb");
if (fp == NULL)
{
perror("Error for fwrite");
exit(EXIT_FAILURE);
}
for (i = 0; i < pCon->size; i++)
{
fwrite(pCon->data + i, sizeof(PeoInfo), 1, fp);
}
fclose(fp);
fp = NULL;
}
static void Load(pContact pCon)
{
FILE *fp = NULL;
PeoInfo tmp = { 0 };
assert(pCon);
fp = fopen("PeoInfo.dat", "rb");
if (fp == NULL)
{
fp = fopen("PeoInfo.dat", "wb");
perror("Error for fread");
exit(EXIT_FAILURE);
}
while (fread(&tmp, sizeof(PeoInfo), 1, fp))
{
if (Check_Capacity(pCon) == 0)
{
printf("Load PeoInfo failure!\n");
exit(EXIT_FAILURE);
}
pCon->data[pCon->size] = tmp;
pCon->size++;
}
fclose(fp);
fp = NULL;
}
需要注意的是,在初始化通讯录时,要调用static void Load(pContact pCon)
函数。