96SEO 2026-02-20 02:29 13
上一篇c语言实践博文我们将静态版的通讯录改成动态版弥补了空间固定的尴尬。

但是这个版本的通讯录还是不完整的。
为什么呢想想看当我们运行程序输入信息退出程序再进入程序之前的数据还在不在了不在了。
因为那些数据是临时存储在内存中的下次打开时已经被清理了。
所以我们需要在退出通讯录时把数据存起来。
在进入通讯录时把数据加载进内存。
在程序已经开始执行的时候通讯录的增删查改与之前逻辑一样不用修改。
但是在对通讯录进行操作之前需要加载保存的数据的内容在退出通讯录时需要保存当前数据到文件中。
之前我们的代码执行逻辑为当用户选择0时先销毁通讯录释放内存再退出。
所以我们要在销毁通讯录之前加一个函数SaveContact用来实现数据的保存。
打开文件。
用fopen函数打开或新建一个文件用文件指针接收。
写入数据。
使用fwrite函数将Data中的数据保存到文件中。
关闭文件。
用fclose函数关闭文件。
打开文件记得检验文件打开是否成功若不成功直接返回并打印错误信息。
写入数据时可以直接用Data数组名加整数的方式来表示要写入数据的指针。
关闭文件时最好将文件指针置为NULL。
NULL){perror(SaveContact::fopen);return;}//数据写入int
按照之前的代码逻辑初始化时要把大小容量初始化为零并为Data开辟一个空间。
而现在我们还需要将文件中的数据存载入Data指向的空间中。
初始化内容。
和前面的版本一样初始化变量开辟内存。
打开文件。
用fopen函数打开保存的文件用文件指针接收。
读取数据。
使用fread函数将文件中的数据读取存放到Data指向的空间。
关闭文件。
用fclose函数关闭文件。
打开文件记得检验文件打开是否成功若不成功直接返回并打印错误信息。
读取数据时可以先用临时变量接收读取内容接着检查空间容量如果足够直接赋值如果不够要开辟空间后再赋值。
每次读取数据不要忘记让数据大小size自增。
关闭文件时最好将文件指针置为NULL。
如果检查内存函数的定义放在后面不要忘记事先声明。
NULL){perror(LoadContact::fopen);return;}//读文件PeoInfo
pf)){CheckCapacity(pc);pc-Data[pc-size]
tmp;pc-size;}//关闭文件fclose(pf);pf
strerror(errno));return;}pc-size
INIT_SIZE;//将文件中的数据加载到通讯录中LoadContact(pc);
NULL){perror(LoadContact::fopen);return;}//读文件PeoInfo
pf)){CheckCapacity(pc);pc-Data[pc-size]
tmp;pc-size;}//关闭文件fclose(pf);pf
strerror(errno));return;}pc-size
INIT_SIZE;//将文件中的数据加载到通讯录中LoadContact(pc);
NULL){printf(CheckCapacity:%s\n,
strerror(errno));return;}pc-Data
{CheckCapacity(pc);printf(请输入名字:);scanf(%s,
pc-Data[pc-size].name);printf(请输入年龄:);scanf(%d,
pc-Data[pc-size].age);printf(请输入性别:);scanf(%s,
pc-Data[pc-size].sex);printf(请输入电话:);scanf(%s,
pc-Data[pc-size].tele);printf(请输入地址:);scanf(%s,
pc-Data[pc-size].addr);pc-size;printf(添加成功\n);
pc-Data[i].name,pc-Data[i].age,pc-Data[i].sex,pc-Data[i].tele,pc-Data[i].addr);}}void
name[MAX_NAME];printf(请输入要删除的名字:);scanf(%s,
FindByName(pc,name);//按名字查找找到了返回下标找不到返回-1if
-1){printf(找不到指定联系人\n);return;}//2.找到了就删除memmove(pc-Data
pos)*sizeof(pc-Data[0]));pc-size--;printf(删除成功\n);
name[MAX_NAME];printf(请输入要查找的人的名字:);scanf(%s,
-1){printf(找不到要查找的人\n);return;}printf(%-15s
pc-Data[pos].name,pc-Data[pos].age,pc-Data[pos].sex,pc-Data[pos].tele,pc-Data[pos].addr);
name[MAX_NAME];printf(请输入要修改的人的名字:);scanf(%s,
-1){printf(找不到要修改的联系人\n);return;}//修改printf(请输入名字:);scanf(%s,
pc-Data[pos].name);printf(请输入年龄:);scanf(%d,
pc-Data[pos].age);printf(请输入性别:);scanf(%s,
pc-Data[pos].sex);printf(请输入电话:);scanf(%s,
pc-Data[pos].tele);printf(请输入地址:);scanf(%s,
pc-Data[pos].addr);printf(修改成功\n);
NULL){perror(SaveContact::fopen);return;}//数据写入int
{printf(***************************\n);printf(*****
*****\n);printf(***************************\n);}
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
con;//定义通讯录//初始化通讯录InitContact(con);do{menu();printf(请选择:);scanf(%d,
SEARCH:ContactSearch(con);break;case
MODIFY:ContactModify(con);break;case
SHOW:ShowContact(con);break;case
SORT:ContactSort(con);break;case
EXIT:SaveContact(con);DestroyContact(con);printf(退出通讯录\n);break;default:printf(选择非法请重新选择\n);break;}}
首先创建文件也可以不手动创建因为fwrite函数会在最后创建出来这里为了展示载入过程手动创建了文件。
好啦到目前位置通讯录就基本完整了。
该有的内容基本都有了。
只不过实现的比较简单还有一些没有细致考虑的东西比如查找重名的问题无法解决。
但是可以再新增函数实现其他方式的查找多项查找都满足才返回需要的数据的位置。
这些不难但是基本逻辑与FindByName函数类似这里就不多讲了没错是我太懒想摸鱼。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback