C语言 通讯录最终版(动态内存+实时保存)
创始人
2024-05-14 15:48:59
0

欢迎来到 Claffic 的博客 💞💞💞

前言:

上期通讯录我们实现了动态内存的申请,但数据依然是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入。

这一期继续改造,让通讯录更加实用,能够实时保存练习人信息。 


 

1.实时保存如何实现?

这就涉及到了数据持久化的问题:

一般 数据持久化的方法有: 把数据存放在磁盘文件、存放到数据库等方式。
使用文件,我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。  所以我们的思路就是在原来录入联系人信息时将信息存放在文件中,退出时自动保存。

2. 相关函数介绍

2.1 fopen 

 fopen 函数的作用是打开指定的文件;

返回值:

   如果打开文件成功,返回指向要打开文件的文件指针;

   如果打开文件失败,返回 NULL;

   所以函数的返回值要做检查;

传参:

   filename : 要打卡文件的名称(包含后缀);

   mode : 使用的方式,yi

2.2 fclose

很直观,作用是关闭文件;

返回值:

   如果关闭成功,返回 0;

   如果关闭失败,返回 EOF;

传参:

   指向要关闭文件的文件指针;

使用文件,养成好习惯:

打开文件 --> 相关操作 -->  关闭文件

#include
void File(Test* pc)
{FILE* pf = fopen("test.txt", "rb");//检查返回值if (pf == NULL){perror("Test");return;}//操作...//关闭文件fclose(pf);pf = NULL;
}

2.3 fread 

 fread 作用是将文件中的信息读取到一块内存缓冲区中;

返回值:

   实际从文件中读取的基本单元个数;

传参:

ptr : 将文件中的二进制数据读取到的缓冲区;

size : 一次读取的基本单元大小,单位是字节;

count : 一次读取的单元个数;

stream : 文件指针,指向要读取的文件。 

2.4 fwrite

fwrite 作用是把数据写入文件中; 返回值: 实际从内存中写入文件的基本单元个数; 传参: 与 fread 类似,将读取改为写入。

3.实现过程

在原有的代码上做修改,只需在退出通讯录时保存通讯录,在初始化通讯录时加载通讯录即可。 保存通讯录部分:
void Save_Contact(Contact* pc)
{FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("Save_Contact");}else{//写入数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data+i, sizeof(PeoInform), 1, pf);}fclose(pf);pf = NULL;printf("保存成功\n");}
}

这一部分用到了 fwrite 函数,将数据写入文件中。

加载通讯录部分:

void Load_Contact(Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("Load_Contact");}else{//读数据PeoInform tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInform), 1, pf)){check_capacity(pc);pc->data[i] = tmp;pc->sz++;i++;}fclose(pf);pf = NULL;}
}

这一部分主体上用 fread 函数来实现,读取文件中的数据;

巧妙的是:

直接将 fread 的返回值作为 while 循环的判断条件:
因为每次只读一个单位的数据,读取成功返回 1 ,到了文件末尾,读取不到数据了,就返回 0 ,跳出循环。

源码已上传至 我的gitee

拿走不谢 ~


总结:

本次通讯录的升级应用到了文件操作的相关知识,掌握了文件操作,数据持久化就不是问题啦 ~

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...