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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

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

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

通讯录的信息保存

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

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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值