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