首页 > 其他分享 >通讯录改造———文件版本

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

时间:2024-04-02 21:34:04浏览次数:13  
标签:文件 读取 改造 pc pf 通讯录 版本 我们

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

保存

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

//退出前存储到文件中
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 查看联系人

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

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

标签:文件,读取,改造,pc,pf,通讯录,版本,我们
From: https://blog.csdn.net/weixin_64099089/article/details/137246004

相关文章

  • Git——版本回退
    关键指令回退到相应版本:指令:gitreset--hard版本号强制推送到远程仓库指令: gitpush-forigin分支名这里需要使用gitpush-f命令强制推送到远程仓库,因为普通的gitpush会因为版本冲突而报错看到这行就代表远程仓库成功回退了版本终端......
  • Git常用命令大全:让你轻松驾驭版本控制
    前言Git是一款强大的分布式版本控制系统,广泛应用于软件开发中。无论是个人开发者还是团队协作,掌握Git的常用命令是至关重要的。本文将介绍Git的常用命令,帮助您更好地管理代码版本。初始化一个新的仓库gitinit这个命令将在当前目录下创建一个新的Git仓库。克隆一个仓库......
  • 查询语句,在Hive版本3.1.0中执行报错,在Hive版本3.1.2中执行成功
    第3条语句执行查询,在Hive版本3.1.0中执行报错:Error:Errorwhileprocessingstatement:FAILED:ExecutionError,returncode2fromorg.apache.hadoop.hive.ql.exec.mr.MapRedTask(state=08S01,code=2),在Hive版本3.1.2中执行成功。新建表CREATETABLEuser_test(cr......
  • IOS开发使用Xcode上传构建版本报错 Distribution failed with errors:Asset validatio
    报错信息:SDKversionissue.ThisappwasbuiltwiththeiOS16.0SDK.AlliOSandiPadOSappsmustbebuiltwiththeiOS16.1SDKorlater,includedinXcode14.1orlater,inordertobeuploadedtoAppStoreConnectorsubmittedfordistribution.Startin......
  • MVCC多版本并发控制
    MVCC(MultiversionConcurrencyControl)中文全程叫多版本并发控制,是现代数据库(包括MySQL、Oracle、PostgreSQL等)引擎实现中常用的处理读写冲突的手段,目的在于提高数据库高并发场景下的吞吐性能。一、undolog我们在进行数据更新操作的时候,不仅会记录redolog日志,而且也会记......
  • nvm管理node版本后手动安装npm包管理
    在命令行npm检查检查过node后,输入指令npm-v来检查npm是否安装成功。毕竟node8以上的版本,就不支持npm的自动安装了。如果显示npm版本号,说明npm也安装成功。如果显示npm非内部指令或外部指令等字样,说明npm并没有自动安装。npm安装失败的处理失败的原因很简单。如果正......
  • Elasticsearch各个版本重要特性
    Elasticsearch各个版本重要特性Elasticsearch5Elasticsearch6.0Elasticsearch7.0Elasticsearch8.0Elasticsearch5首先说明下,ES是从版本2直接跳到5的,主要是为了和ElasticStack其他组件保持版本一致ES5,在现在来说是比较老的版本了,就不多介绍了建议大家使用ES7,或者直接使用ES8E......
  • ios 之 netty版本swiftNio(socket创建)
    SwiftNio简介用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这就像Netty,但是为Swift写的。Xcode引入swiftNio        在实际写代码前,......
  • IDEA中新建SpringBoot模块,JDK版本问题解决
    问题描述IDEA中新建SpringBoot模块,使用的JAVAJDK1.8,新建模块时选项中没有JDK8: 运行时报错,JDK之类的问题解决方案,查看修改以下四个地方:(1)设置-Java编译器 (2)项目结构--依赖以及源码 ......
  • Har 版本包发布
    新建Module注意名字最好是小写命名oh-package.json5修改description描述信息在Index.ets导出对外暴露的组件export{TitleBar}from'./src/main/ets/view/TitleBar' 编译生成har包 生成公钥和私钥新建文件夹,新建空的pub文件。命令生成公钥和私钥......