改造之前的通讯录;
使得通讯录,可以动态的增长空间
修改结构(头文件修改)
typedef struct Contact
{
PeoInfo* data;
int sz;//有效元素的个数
int capacity;//容量
}Contact;
新增函数:
void CheckCapacity(Contact* pcon)
{
if(pcon->sz == pcon->capacity)
{
//每次扩容双倍
PeoInfo* ptr = realloc(pcon->data, (pcon->capacity * 2)*sizeof(PeoInfo));
if(ptr != NULL)
{
pcon->data = ptr;
pcon->capacity *= 2;
printf("增容成功\n");
}
}
}
void DestroyContact(Contact* pcon)
{
free(pcon->data);
pcon->data = NULL;
pcon->capacity = 0;
pcon->sz = 0;
}
修改函数:
void AddContact(Contact* pcon)
{
assert(pcon);
/******新增代码******/
CheckCapacity(pcon); //插入前检查扩容情况
/******************/
//录入信息
printf("请输入名字:>");
scanf("%s", pcon->data[pcon->sz].name);
printf("请输入年龄:>");
scanf("%d", &(pcon->data[pcon->sz].age));
printf("请输入性别:>");
scanf("%s", pcon->data[pcon->sz].sex);
printf("请输入电话:>");
scanf("%s", pcon->data[pcon->sz].tele);
printf("请输入地址:>");
scanf("%s", pcon->data[pcon->sz].addr);
pcon->sz++;
printf("增加成功\n");
}
void InitContact(Contact* pcon)
{
assert(pcon);
pcon->sz = 0;
//memset(pcon->data, 0, sizeof(pcon->data)); //这回需要手动分配空间了。
/******新增代码******/
pcon->data = (PeoInfo *)calloc(DEFAULT_SZ, sizeof(PeoInfo)); //分配默认大小并清空
if(pcon->data == NULL) //检查分配是否成功
{
printf("%s\n", strerror(errno));
return;
}
pcon->capacity = DEFAULT_SZ;
/******************/
}
测试函数修改:
case EXIT:
DestroyContact(&con); //退出时销毁
printf("退出程序\n");
break;
在之前的通讯录上增加两个函数,实现数据可以保存到文件,也可以从文件中加载数据。
a. 添加一个函数,在退出通讯录的时候把信息到保存到文件中
b. 添加一个函数,在通讯录打开的时候,可以把文件中的信息加载到通讯录中
新增函数:
void LoadContact(Contact* pcon)
{
PeoInfo tmp = {0};
FILE* pfRead = fopen("contact.dat", "rb");
if(pfRead == NULL)
{
printf("加载信息:打开文件失败\n");
return;
}
//加载信息
while(fread(&tmp, sizeof(PeoInfo), 1, pfRead))
{
CheckCapacity(pcon);
pcon->data[pcon->sz] = tmp;
pcon->sz++;
}
fclose(pfRead);
pfRead = NULL;
}
void SaveContact(Contact* pcon)
{
int i = 0;
FILE* pfWrite = fopen("contact.dat", "wb");
if(pfWrite == NULL)
{
printf("保存信息:打开文件失败\n");
return;
}
//保存信息
for(i=0; i<pcon->sz; i++)
{
fwrite(pcon->data+i, sizeof(PeoInfo), 1, pfWrite);
}
//关闭文件
fclose(pfWrite);
pfWrite = NULL;
}
修改函数:
void InitContact(Contact* pcon)
{
assert(pcon);
pcon->sz = 0;
pcon->data = (PeoInfo *)calloc(DEFAULT_SZ, sizeof(PeoInfo));
if(pcon->data == NULL)
{
printf("%s\n", strerror(errno));
return;
}
pcon->capacity = DEFAULT_SZ;
/*******新增代码*********/
LoadContact(pcon); //初始化时直接读取
/**********************/
}
测试函数修改:
case EXIT:
SaveContact(&con); //退出时先保存
DestroyContact(&con); //再销毁
printf("退出程序\n");
break;