通讯录改造———文件版本

上一篇文章我们详细讲了文件操作,这时候我们就可以把通讯录保存到文件中,这样即使程序退出了,联系人的信息也还是保存着,下一次启动程序时我们就可以把文件中的数据读取到程序中来使用。

保存

首先我们要在退出通讯录之前把联系人的信息都保存到文件中。

//退出前存储到文件中
void Save_Contact(Contact* pc)
{
	assert(pc);
	FILE*pf=fopen("contact.txt", "wb");
	int i = 0;
	for (i = 0; i < pc->count; i++)
	{
		if (fwrite((&pc->data[i]), sizeof(People), 1, pf) != 1)
		{
			perror("fwrite fail");
			exit(-1);
		}
	}
	fclose(pf);
	pf = NULL;
}

我们可以像这样一个一个保存进去,这样如果在中间某一个数据保存失败时就会退出程序,并且打印提示信息。

这时候我们就能发现文件中已经存进去内容了。

读取文件

读取文件的操作应该在初始化之后就读取,,读取文件的时候,我们首先要进行判断我们的工程里面是否有没有这个文件,比如第一次使用通讯录的时候,我们还没有创建这个文件,只有在第一次使用结束的时候我们才会创建。读取的时候我们也一个一个的读取,防止中间读取失败,每次读取之前判断一下size和count是否相等,是否需要扩容。

//读取数据
void ReadtoContact(Contact* pc)
{
	assert(pc);
	FILE* pf = fopen("contact.txt", "rb");
	if (pf != NULL)
	{
		People tmp;
		while (fread(&tmp, sizeof(People), 1, pf) == 1)
		{
			Check(pc);
			pc->data[pc->count] = tmp;
			pc->count++;
		}
        fclose(pf);
	    pf = NULL;
	}

}

要注意区分写入数据的是,我们不知道文件中存了几个联系人的信息,所以我们只能通过fread函数的返回值来判断是否读取结束。

功能测试

我们先将之前测试生成的contact.txt文件删除掉,首先测试一下初始化通讯录时会不会出现一些多余的数据

我们可以看到第一次进来通讯录时是不会载入任何内容的。

接着我们添加几个联系人进去,再退出程序,看是否会生成应该txt文件。

如图我们已经添加了几个联系人,并且退出了程序。这是我们右击源文件点击添加现有项

我们就能发现在我们的工程目录下已经创建了一个通讯录的文件

当我们添加进来之后打开这个文件,会发现文件已经有了内容,虽然我们看不懂,因为我们是以二进制形式写入的,之后我们也会用二进制的形式读取数据。

这时候我们再次打开程序,然后直接选择 6 查看联系人

我们就能确定上一次程序退出之前确实已经把数据存到文件中去了,而且我们读取数据的函数也没问题。

增加了这两个函数就能够将通讯录升级到文件版本了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲&#xff0c;SpringBoot 在Spring生态基础上发展而来&#xff0c;它的发现不是取代Spring&#xff0c;是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

R语言,数据类型转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

IP地址与子网掩码

1 IP地址 1.1 IPv4与IPv6 1.2 IPv4地址详解 IPv4地址分4段&#xff0c;每段8位&#xff0c;共32位二进制数组成。 1.2.1 地址分类 这32位又被分为网络号和主机号两部分&#xff0c;根据网络号占用位数的不同&#xff0c;又可分为以下几类&#xff1a; A类地址&#xff1a;…

Higress 基于自定义插件访问 Redis

作者&#xff1a;钰诚 简介 基于 wasm 机制&#xff0c;Higress 提供了优秀的可扩展性&#xff0c;用户可以基于 Go/C/Rust 编写 wasm 插件&#xff0c;自定义请求处理逻辑&#xff0c;满足用户的个性化需求&#xff0c;目前插件已经支持 redis 调用&#xff0c;使得用户能够…

Windows提权—数据库提权-mysql提权mssql提权Oracle数据库提权

目录 Windows 提权—数据库提权一、mysql提权1.1 udf提权1.1.2 操作方法一 、MSF自动化--UDF提权--漏洞利用1.1.3 操作方法二、 手工导出sqlmap中的dll1.1.4 操作方法三、 moon.php大马利用 1.2 mof提权1.3 启动项提权1.4 反弹shell 二、MSSQL提权MSSQL提权方法1.使用xp_cmdshe…

Ps:阈值

阈值 Threshold命令可将灰度图像或彩色图像转换为仅包含黑色和白色的二值图像。 Ps菜单&#xff1a;图像/调整/阈值 Adjustments/Threshold Ps菜单&#xff1a;图层/新建调整图层/阈值 New Adjustment Layer/Threshold 阈值命令通过设置一个特定的亮度阈值&#xff08;阈值色阶…

深度解析:Elasticsearch检索请求原理

在上一篇文章中&#xff0c;我们学习了 Elasticsearch 的写入流程&#xff0c;今天我们来学习一下 Elasticsearch 的读取流程&#xff0c;当一个检索请求到达 Elasticsearch 之后是如何进行检索的呢&#xff1f; 下面先说一下一个总的检索流程。 1、客户端发送请求到任意一个…

企业能耗数据分析有哪些优势?怎样进行分析?

随着互联网技术的发展&#xff0c;企业在运营中会出现大量的用能数据&#xff0c;但却做不了精准的用能数据分析&#xff0c;导致数据没有得到有效利用&#xff0c;以及产生能源浪费现象。 为什么企业用能分析总是难&#xff1f; 一、用能分析过程复杂 由于用能分析过于复杂…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

读所罗门的密码笔记07_共生思想(中)

1. 在人工智能系统中建立信任 1.1. 人类的大脑容易被个人倾向、干扰因素和确认偏误所影响 1.2. 古莱说&#xff0c;然而&#xff0c;从不同的角度去思考事实、花更长时间来做决策的能力&#xff0c;可能会让人类拥有“密探”一般的智慧 1.3. 我们可以对决策进行批判性思考&a…

c语言----自定义类型---结构体(声明、重命名、对齐规则、传参、位段...详解)

目录 一、结构体类型的声明二、结构体的特殊声明三、结构体的重命名四、结构体的自引用五、结构体的内存对齐5.1对齐规则5.1.1练习 5.2为什么存在内存对齐?5.3 修改默认对齐数 六、结构体传参七、结构体实现位段7.1什么是位段7.2 位段的内存分配7.3 位段的跨平台问题7.4 位段的…

谷粒商城——通过接口幂等性防止重复提交订单

如果用户向后端服务提交多次相同订单的提交服务&#xff0c;那么后端应该只生成一条订单记录。 有一些操作天然是幂等的&#xff0c;如查询操作和删除操作等。 幂等性实现 1.token机制&#xff08;仅这个方法适用于订单的重复提交&#xff09; 后端先生成1个令牌将其记录在R…

智能停车场物联网远程监控解决方案

智能停车场物联网远程监控解决方案 智能停车场物联网远程监控解决方案是一种集成了现代物联网技术、大数据分析以及云计算等先进技术手段&#xff0c;对停车场进行全面智能化管理的综合系统。它通过实时感知、精准采集和高效传输各类停车数据&#xff0c;实现对停车场运营状态…

机器学习(四)

贝叶斯分类器与贝叶斯学习: 贝叶斯分类器:只要是一种生成式模型&#xff0c;并且使用到了贝叶斯公式 贝叶斯学习:一定在使用分布估计 贝叶斯分类器并不等于贝叶斯学习 极大似然估计: 先假设某种概率分布形式&#xff0c;再基于训练样例对参数进行估计 集成学习: 如何得到…

C#学习笔记 面试提要

冒泡 for (int m 0; m < arr.Length; m) { for (int n 0; n < arr.Length - 1 - m; n) { if (arr[n] > arr[n1]) { int temp arr[n]; arr[n] arr[n 1]; arr[n1] temp; } } } 选择 for (int m 0; m < arr.Length; m) { int index 0; for (int n 1; n < …

亿图图示如何绘制WBS分解?

什么是WBS分解&#xff1f; Wbs分解俗称工作分解结构法&#xff0c;就是把一个大项目按照原则分成多个小任务&#xff0c;再把每项小任务分解成具体的工作&#xff0c;然后把工作分到每人的工作中的一种分解方法。 如下图这里以开店KTV为例&#xff0c;项目是开店&#xff0c;小…

Unity UGUI之Text组件基础认识

Text组件用于在游戏中显示文本。 下面来细看下它的基本信息。 一、基本属性&#xff1a; 如上图所示&#xff0c;即为Text组件的一些基本属性&#xff0c;其中&#xff0c; Text&#xff1a;要显示的文本内容。Font&#xff1a;文本所使用的字体。Font Style&#xff08;字体…

基于PSO优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…

【C语言基础】:自定义类型(二) -->联合和枚举

文章目录 一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体练习 二、枚举类型2.1 枚举类型的声明2.2 枚举的优点 书山有路勤为径&#xff0c;学海无涯苦作舟。 创作不易&#xff0c;宝子们&#xff01;如果这篇…