C语言—通讯录(可保存通讯录信息)

该文章描述了一个简单的通讯录程序,通过C语言实现了数据的保存和加载,以达到数据持久化的目的。通讯录信息存储在磁盘文件中,当程序运行时可以从文件加载数据,退出时保存到文件。程序包含了初始化、增删查改联系人、文件读写以及内存管理等功能。
摘要由CSDN通过智能技术生成

前言

在写完通讯录的程序时,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。

既然是通讯录就应该把信息记录下来,只有当选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,一般数据持久化的方法有把数据存放在磁盘文件、存放到数据库等方式。

使用文件可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

通讯录的信息保存

通讯录退出时需要保存通讯录的信息,注意要在销毁通讯录之前保存通讯录信息到文件。通讯录的信息保存是通过文件操作将通讯录信息写到文件中去从而进行信息的保存。

void SaveContact(Contact* pc)
{
   
	FILE* pf = fopen("contact.dat", "w");
	if (pf == NULL)
	{
   
		perror("SaveContact");
		return;
	}
	//写文件
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
   
		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}

通讯录的信息加载

在对通讯录增删查改之前,通讯录得加载之前存有的信息,因此只有在初始化通讯录的时候从文件中读取信息到通讯录中从而完成信息加载的过程。信息加载读取文件时读到什么时候停止(不知道文件有多少信息),这时需要用到fread函数,通过fread函数的返回值进行判断如果小于实际要读取的count个数说明这次读取fread已经读完了不可能再读到数据了。从文件中读取数据放到通讯录中,往通讯录中放数据时需要注意通讯录刚初始化时通讯录最多能存放DEFAULT_SZ个数据,加载信息的数据个数可能比刚初始化通讯录的容量大。这时需要判断是否需要增容即可。判断完增容之后这时再把从文件中读取到的人的信息添加到刚初始化的通讯录中,然后当前通讯录中有效信息的个数加一。

void CheckCapacity(Contact* pc)
{
   
	if (pc->sz == pc->capacity)
	{
   
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
   
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功\n");
		}
		else
		{
   
			perror("AddContact");
			printf("增加联系人失败\n");
			return;
		}
	}
}

void LoadContact(Contact* pc)
{
   
	FILE* pf = fopen("contact.dat", "r");
	if (pf == NULL)
	{
   
		perror("LoadContact");
		return;
	}
	//读文件
	PeoInfo tmp = {
    0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
   
		//是否需要增容
		CheckCapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}

	//关闭文件
	fclose(pf);
	pf = NULL;
}


//初始化
void InitContact(Contact* pc)
{
   
	pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (pc->data == NULL)
	{
   
		perror("InitContact");
		return;
	}
	pc->sz = 0;//初始化后默认是0
	pc->capacity = DEFAULT_SZ;

	//加载文件
	LoadContact(pc);
}

通讯录(可保存通讯录信息)整体代码

contact.h

#pragma once


#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME 20
#define MAX_SEX 10
一、题目:通讯录管理 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题 2. 要求 基本要求: 1. 要求利用C语言面向过程的编程思想来完成系统的设计; 2. 突出C语言的函数特征,以多个函数实现每一个子功能; 3. 画出功能模块图; 4. 具有清晰的程序流程图和数据结构的详细定义; 5. 熟练掌握C语言对文件的各种操作。 创新要求: 在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同 三、信息描述 有关该系统基本信息的描述,如:姓名、电话、城市和邮编等。 四、功能描述 1. 名单基本信息(姓名,城市,电话,邮编等)的录入,并存放在文件当中。 2. 基本信息的查询与修改。 3. 记录的添加和删除。 4. 对同一类型记录的查找:如查找同一城市的记录或同一省份的记录。 五、解决方案 1. 分析程序的功能要求,划分程序功能模块。 2. 画出系统流程图。 3. 代码的编写。定义数据结构和各个功能子函数。 4. 程序的功能调试。 5. 完成系统总结报告以及使用说明书 六、进度安排 此次课程设计时间为一周或两周,分四个阶段完成: 1. 分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。 2. 编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。 3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。 4. 考核阶段。 七、撰写课程设计报告或课程设计总结 课程设计报告要求: 总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值