目录
0.前言
本篇是对通讯录进行的动态改造。静态原型原型在我的上一篇文章中,跳转链接:逐步分析C语言实现通讯录(内有结构体基础讲解和qsort基本使用方法讲解)_wsyjpgs的博客-CSDN博客
本次我们将实现动态内存存储,以及文件的存储。
1.动态改造
1.1结构体改造
如果我们要进行动态的改造,那么就必须对静态定义的结构体进行改造
我们知道动态内存是由指针进行维护的,所以我们要将Arr改为指针变量。还有就是动态内存的最大存放量是会改变的,所以我们要定义一个量来存放当前的最大值
当然啦,动态内存就得有初始容量和后续扩大的容量,所以这里我宏定义了两个常量。
万事俱备我们现在可以正式开始改造啦。
1.2初始化函数改造
既然我们的数据要改成动态存储,我们的初始化就不能是静态的初始化了。这里我们对这个代码进行改造:
改造后:
这里稍微解释一下,calloc函数,这里就是开辟了DEF_SZ个communication大小的内存。
ptr变量的引用是用来判断是否开辟成功的。
1.3扩容函数
上文我们把内存成功改成了动态的,那么我们的数据检查函数是不是也要进行对应的修改。
现在我们来到Add函数中
制作静态版本的时候是不是数据满了就不能放入数据了。那么动态版本显然就不能这样做,动态内存不够了,是不是要进行扩容啊,所以需要进行扩容操作.
声明:
实现:
这里的realloc函数的参数我解释一下:Cur_max是原来数据的最大量,ADD_SZ是扩容的大小,所以两个加起来就是新的大小。
这里用ptr接收而不用Arr直接接收的原因是:万一扩容失败了,返回的是NULL如果这里直接用Arr进行接收,会导致原来的数据丢失,也会导致旧的内存没有指针维护导致内存泄漏。
1.4内存释放
上面的改造我们完成了,现在进行测试一下:
我们这里发现已经实现了。
接下来我们就要实现内存的释放。那么我们什么时候需要释放呢?一共是两个地方:第一个地方自然是退出通讯录的时候需要释放;第二个地方是clear的时候,我们需要把之前的数据释放,才可以重新初始化。
声明:
实现:
这里我就不过多赘述哩,因为这个就是释放的标准过程,我只是封装成一个函数而已。
2.文件存储:
我们在上文实现了动态内存存储,可是数据还是只能存在内存中,我们无法对数据进行持久化存储。接下来我们就要写一些函数来实现数据的读取和写入。
2.1数据读入
我这里打算的是,在每次启动软件时自动读取数据。所以我在初始化函数后加上了读取函数。
声明:
实现:
这里简单讲解一下while循环:这里就是多组读入,当文件读到末尾时会返回EOF给fscanf也就是返回-1,而-1按位取反是0,所以这里用这个循环读取数据。然后把数据判断放到函数中,对动态内存进行及时扩容。
2.2文件写入
我这里的想法是在程序退出时,对内存中的数据进行自动保存。
声明:
实现:
这里没有什么需要说明的,就是将内存中的数据一个一个写入文件。
3.代码概览
3.1源
3.2function.h
3.3function.cpp
4.结语
到这里,我们的通讯录就全部完成了,感谢大家的浏览