通讯录 (修改版)

通讯录管理系统:动态扩容与文件操作
本文介绍了一个通讯录管理系统的改造,通过动态扩容功能确保了内存的高效利用,同时添加了从文件加载和保存联系人信息的功能。在退出时,系统会先保存数据到文件,然后释放内存资源。新增的`CheckCapacity`函数实现了当容量不足时的双倍扩容,`LoadContact`用于从文件加载数据,`SaveContact`则用于将数据保存到文件。这些改进提高了系统的实用性和数据安全性。

改造之前的通讯录;

使得通讯录,可以动态的增长空间

修改结构(头文件修改)

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;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值