通讯录(文件版本)

简介: 通讯录(文件版本)

无论是上面的静态版本的通讯录或者是动态版本的通讯录,在程序运行结束之后都会被销毁掉,就是保存的联系人的数据也会丢失,这显然不符合我们对通讯录的需求,我们正常需要的是能够在下一次打开通讯录的时候找到以前保存过的联系人的信息,这样才是有意义的通讯录,那我们可以把以上两个版本的通讯录进行改造,使它变成文件版本的通讯录,即把每次存进去的信息在程序关闭之前保存到文件当中,在下一次打开程序的时候自动加载到程序当中,这样才是符合我们需求的通讯录。


其实我们只需要增加两个函数即可,即退出程序前保存数据和运行程序时加载数据的函数:


//新增函数
//保存通讯录信息到文件中
void SaveContact(Contact* con)
{
  assert(con);
  //以二进制写的形式打开文件“wb”
  FILE* pf = fopen("contact.txt", "wb");
  if (pf == NULL)
  {
    perror("SaveContact");
    return;
  }
  int i = 0;
  //遍历把数据逐一写到文件中
  for (i = 0; i < con->sz; i++)
  {
      //参数意义:1.待写入数据的地址,2.结构体大小
      //3.一次写入的数据的数量,逐一写入,4.存放数据的地址
    fwrite(con->data + i, sizeof(peo_info), 1, pf);
  }
  fclose(pf);//关闭文件
  pf = NULL;
  printf("保存成功!\n");
}


void check_capacity(Contact* con)
{
  assert(con);
  if (con->capacity == con->sz)
  {
    peo_info* p = (peo_info*)realloc(con->data, sizeof(peo_info) * (con->capacity + 2));
    if (p == NULL)
    {
      perror("realloc");
      return;
    }
    else
    {
      con->data = p;
      con->capacity += 2;
      printf("增容成功!\n");
    }
  }
}
//新增函数
void LoadContact(Contact* con)
{
  assert(con);
  //由于保存数据时是用二进制的形式写进文件中
  //所以需要用二进制读的形式打开文件
  FILE* pf = fopen("contact.txt", "rb");
  if (pf == NULL)
  {
    perror("LoadContact");
    return;
  }
  //读数据,需要创建一个临时变量
  peo_info tmp = { 0 };
  int i = 0;
  //fread函数读到一个数据返回1,读不到数据返回返回0
  //循环就停止
  while (fread(&tmp, sizeof(peo_info), 1, pf))
  {
    //读到一个数据需要先检查是否需要增容
    check_capacity(con);
    con->data[i] = tmp;//对应位置进行结构体赋值即可
    i++;
    con->sz++;//每加载一个数据数量sz+1
  }
  printf("加载成功!\n");
  fclose(pf);//关闭文件
  pf = NULL;
}
void InitContact(Contact* con)
{
  assert(con);
  peo_info* p = (peo_info*)calloc(2, sizeof(peo_info));
  if (p == NULL)
  {
    perror("InitContact");
    return;
  }
  con->data = p;
  con->sz = 0;
  con->capacity = 2;
  //新增函数,初始化完成后加载数据到程序中
  //加载文件信息到通讯录
  LoadContact(con);
}



SaveContact函数保存数据在Destroy之前调用即可。


以上就是通讯录文件版本新增的两个函数,这个就是符合我们需求的通讯录的最终版本哦。你学会了吗?

相关文章
|
10月前
|
人工智能 自然语言处理 搜索推荐
“AI拜年”火遍朋友圈,营销的终局是拼技术
2025年春节前夕,AI拜年成为新潮流。百度通过“春节祝福语”活动,利用文心大模型4.0 Turbo生成个性化拜年贺卡,用户只需上传照片和输入文案,即可获得高度逼真的定制贺卡。这项技术凭借iRAG(检索增强生成)实现了高精度图像生成,避免了常见的“AI味儿”,使AI生成的内容既真实又富有文化内涵,为普通用户带来了专业级的创作体验,也为图像生成的产业化落地铺平了道路。
483 9
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
存储 Java 分布式数据库
【分布式计算框架】HBase数据库编程实践
【分布式计算框架】HBase数据库编程实践
349 1
|
网络协议 安全 Shell
配置ssh服务
配置ssh服务
|
前端开发 JavaScript API
|
JavaScript 前端开发 安全
深入探究iframe:网页嵌入的魔法盒子(上)
深入探究iframe:网页嵌入的魔法盒子(上)
|
druid 关系型数据库 MySQL
高并发下 MySQL Statement Cancellation Timer 的线程数暴涨
高并发下 MySQL Statement Cancellation Timer 的线程数暴涨
|
安全 前端开发 Java
SpringBoot整合Spring Security,使用短信验证码方式进行登录(七)
该类和图片验证码差不多,只是多个手机号判断,需要注意的是,这里拦截的是/smslogin接口,该接口为短信登录的接口,该接口不像/login接口由security提供,需要我们自己实现。
983 0
|
存储 SQL 弹性计算
阿里DDD四弹拜读
阿里殷浩大牛写了DDD系统文章,现在已经更新到每四篇,有很多异于常规的地方,收获良多,总结一下
1947 0
阿里DDD四弹拜读
|
存储 数据采集 人工智能
刚刚,国内的自主智能体OmBot发布了
刚刚,国内的自主智能体OmBot发布了
557 0