本文基于上一篇动态通讯录实现:简易实现通讯录2.0
前言:
本文将在上文的基础上,实现文件保存操作,因为上文中我们发现,我们的通讯录在每次打开都需要重新输入,这很不符合我们的认知,我们的通讯录都是可以打开就直接查看某个用户的,今天我们就将用户数据写入文件,实现更真实的通讯录.
1.在退出时保存文件
首先我们在主函数选择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; }
2.在初始化通讯录的时候读取文件信息写入通讯录
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); }
3.加载函数的书写
这里我们先读取文件,成功读取就写入文件.
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; }
4.实验
这里可以看到我们上次保存的数据了,代码分享见秋秋的代码仓库