通讯录的实现框架
1.在动态版本的基础上增加退出程序后通讯录的信息保存到文件中
2.下一次打开程序,上次写的通讯录的信息不会销毁
改写思路
1.退出之前保存信息
test.c中
接下来在contact.h中声明
contact.c中实现
void SaveContact(const Contact* pc)
{
assert(pc);
FILE* pfWrite = fopen("contact.txt", "wb");
if(pfWrite == NULL)
{
perror("SaveContact");
return;
}
//写文件-二进制的方式
int i = 0;
for(i=0; i<pc->count; i++)
{
fwrite(pc->data+i, sizeof(PeoInfo), 1, pfWrite);
}
fclose(pfWrite);
pfWrite = NULL;
}
2.加载文件中的信息到通讯录
在初始化函数中
然后再contact.h中声明
在contact.c中实现
void LoadContact(Contact* pc)
{
assert(pc);
FILE* pfRead = fopen("contact.txt", "rb");
if(pfRead == NULL)
{
perror("LoadContact");
return;
}
//加载
PeoInfo tmp = {
0 };
while(fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1)
{
//判断增容
CheckCapacity(pc);
pc->data[pc->count] = tmp;
pc->count++;
}
fclose(pfRead);
pfRead = NULL;
}
fread返回读取数据成功的个数,我们每次读取1个数据,用是否返回1判断数据是否读取完
初始容量是3,所以要判断是否增容.
一开始pc->count为0,所以
pc->data[pc->count] = tmp;
pc->count++;
test.c的代码
#include "contact.h"
enum Option
{
Exit,
Add,
Del,
Search,
Modify,
Show,
Sort
};
void menu()
{
printf("**************************************\n");
printf("**** 1.Add 2.Del *****\n");
printf("**** 3.Search 4.Modify *****\n");
printf("**** 5.Show 6.Sort *****\n");
printf("**** 0.Exit *****\n");
printf("**************************************\n");
}
int main()
{
Contact con;//通讯录
InitContact(&con);
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case Add:
AddContact(&con);
break;
case Del:
DelContact(&con);
break;
case Search:
SearchContact(&con);
break;
case Modify:
ModifyContact(&con);
break;
case Show:
ShowContact(&con);
break;
case Sort