C语言进阶习题【2】(4结构体进阶)——通讯录的实现3

1. 本节在动态版本通讯录的基础上实现存储功能

在动态版本的基础上,对于通讯录的新增了存储到文件中,可以从文件中打开我们存储的通信录功能。新增函数:saveContatc()和loadContact()

2. 具体实现

2.1 contact.h

//保存通讯录
void saveContact(Contact* pc);
//加载文件信息到通讯录
void loadContact(Contact* pc);

2.2 saveContatc()

//8.保存通讯录
void saveContact(Contact* pc)
{
   
	//写数据
	//(1)打开文件
	FILE* pf = fopen("contact.txt", "wb");
	if (NULL == pf)
	{
   
		perror("saveContact");
	}
	else
	{
   
		//(2)写数据
		int i = 0;
		printf("%s", pc->data->name);
		for (i = 0; i < pc->sz; i++)
		{
   
			fwrite(pc->data + i, sizeof(PeoInfo),1,pf);
		}
		
		//(3)关闭文件
		fclose(pf);
		pf = NULL;

		printf("保存数据成功\n");
	}
}

2.3 loadContact()


//加载文件信息到通讯录
void loadContact(Contact* pc)
{
   
	//读数据
	//(1)打开文件
	FILE* pf = fopen("contact.txt", "rb");
	if (NULL == pf)
	{
   
		perror("loadContact");
	}
	else
	{
   	//(2)读数据
		PeoInfo tem = {
    0 };
		int i = 0;
		while(fread(&tem, sizeof(PeoInfo), 1, pf))
		{
   
			//放置前要考虑增容的问题~
			check_capacity(pc);
			pc->data[i] = tem;
			pc->sz++;
			i++;
		}
		//(3)关闭文件
		fclose(pf);
		pf = NULL;
	}
}

3.报错

在这里插入图片描述

最后定位到我的增容函数错误,增容没有增加我空间,还是之前的大小。所以一直增容其实是失败的,下面的正确的增容函数

void check_capacity(Contact* pc)
{
   
	if (pc->sz == pc->capacity)
	{
   
		PeoInfo* ptr = (PeoInfo * )realloc(pc->data, (pc->capacity +INC_SZ) * sizeof(PeoInfo));
		//这版本在调试的时候发现我之前的这个增容函数写的不对,
		//之前的版本是PeoInfo* ptr = (PeoInfo * )realloc(pc->data, (pc->capacity) * sizeof(PeoInfo));
		//相当于我没有申请到空间,所以保存通讯录的时候一直失败。
		if (ptr == NULL)
		{
   
			perror("check_capacity::realloc");
			return;
		}
		pc->data = ptr;
		pc->capacity += INC_SZ;
		printf("增容成功!\n");
	}
}

4. 源代码

4.1 contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once

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


#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 24
#define TELE_MAX 12

#define DEFAULT_SZ 3
#define INC_SZ 2

typedef struct PeoInfo
{
   
	char name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值