本文基于上一篇动态通讯录实现:简易实现通讯录2.0
本文将在上文的基础上,实现文件保存操作,因为上文中我们发现,我们的通讯录在每次打开都需要重新输入,这很不符合我们的认知,我们的通讯录都是可以打开就直接查看某个用户的,今天我们就将用户数据写入文件,实现更真实的通讯录.
首先我们在主函数选择0退出的时候加上一个写入文件的操作
下面我们开始写写入文件的操作,我们这里每次写入一条信息,以二进制方式写入.
void SaveContact(Contact* pc) { FILE* pf = fopen("contact.txt", "wb"); if (pf == NULL) { perror("SaveContact"); return; } //写信息到文件 int i = 0; for (i = 0; i < pc->sz; i++) { /*fwrite(&(pc->data[i]), sizeof(PeoInfo), 1, pf);*/ //每次以一条信息为单位写入 fwrite(pc->data+i, sizeof(PeoInfo), 1, pf); } //记得关闭文件 fclose(pf); pf == NULL; }
-
-
- void InitContact(Contact* pc)
- {
- assert(pc);
- pc->sz = 0;
- pc->capacity = DEFAULT_SIZE;
- pc->data = calloc(pc->capacity, sizeof(PeoInfo));
- if (pc->data == NULL)
- {
- perror("error");
- return;
- }
- //加载文件中的信息到通讯录中
- LoadContact(pc);
- }
这里我们先读取文件,成功读取就写入文件.
- void CheckCapacity(Contact* pc);
- void LoadContact(Contact* pc)
- {
- //打开文件,读取文件,关闭文件
- FILE* pf = fopen("contact.txt", "rb");
- if (pf == NULL)
- {
- perror("LoadContact");
- return;
- }
- //读文件
- PeoInfo tmp = { 0 };
- while (fread(&tmp, sizeof(tmp), 1, pf))
- {
- //先判断容量
- CheckCapacity(pc);
- pc->data[pc->sz] = tmp;
- pc->sz++;
- }
-
- //关闭
- fclose(pf);
- pf == NULL;
-
-
-
- }
这里可以看到我们上次保存的数据了,代码分享见秋秋的代码仓库