我们在前文中介绍了如何实现简易通讯录
后来又改进了通讯录,使之可以进行动态内存管理。
但是,我们的通讯录程序是只能一次性使用的,退出程序所有的内容都消失了,那么本文就来实现将通讯录的数据写入到硬盘上的文件。再次打开程序时,再从文件上读取数据。实现数据的持久性。
代码如下:
addressBook.h文件
#pragma once
//头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_TELE 12
#define MAX_ADDR 20
#define MAX 1000
#define INIT_SZ 3
#define CAP_ADD 2
enum fun
{
EXIT,//从0开始,EXIT = 0
ADD,//1
DEL,//2
SEARCH,//3
MODIFY,//4
PRINT,
SORT,
DESTORY
};
//个人信息结构体:
typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
通讯录结构体:静态版本
//typedef struct Book
//{
// PeoInfo data[MAX];//
// int size;//记录当前通讯录中有效的信息个数
//}Book;
//通讯录结构体:动态版本
typedef struct Book
{
PeoInfo* data;//动态版本:记录个人信息
int size;//记录当前通讯录中有效的信息个数
int cap;//记录当前的最大容量,以便满了通过动态内存管理来扩充
}Book;
//菜单函数声明:
void menu(void);
void menu_ins(void);
//初始化通讯录函数声明
void InitMsg(Book*);
//增加通讯录信息函数声明:
void AddMsg(Book* );
//打印通讯录信息函数声明:
void PrintMsg(Book* );
//删除通讯录信息函数声明:
void DelMsg(Book* );
//查找通讯录信息函数声明:
void SearchMsg(Book*);
//修改通讯录信息函数声明:
void ModMsg(Book*);
//排序通讯录信息函数声明:
void SortMsg(Book*);
//通讯录动态空间释放函数声明:
void DestroyMsg(Book*);
//检查是否需要增容:
void CheckCap(Book* pc);
//保存通讯录信息到文件中的函数声明:
void SaveMsg(Book*);
//程序打开,初始化通讯录时,加载文件中的数据到通讯录中函数声明:
void LoadMsg(Book*);
//删除文件中通讯录信息,清空通讯录文件
void nothing(Book* pc);
addressBook.c文件
//
//本文件包括 各功能函数:
#include "addressBook.h"
//菜单显示:
void menu()
{
printf("********************************\n");
printf("****** 1.增加 2.删去 ******\n");
printf("****** 3.搜索 4.修改 *****\n");
printf("****** 5.浏览 6.排序 *****\n");
printf("****** 0.退出 7.销毁 *******\n");
printf("********************************\n");
}
//菜单说明:
void menu_ins()
{
printf("菜单说明\n");
printf("增加:增加通讯录信息\n");
printf("删去:输入姓名,删去该姓名对应的通讯录信息\n");
printf("搜索:输入姓名,搜索并打印该姓名对应的通讯录信息\n");
printf("修改:输入姓名,修改该姓名对应的通讯录信息\n");
printf("浏览:打印出全部通讯录信息\n");
printf("排序:根据姓名/年龄排序通讯录信息\n");
printf("销毁:清空通讯录及文件中的数据信息\n");
}
//通过姓名来寻找某条通讯录信息函数:
static int FindByName(Book* pc, char* name)
{
for (int i = 0; i < pc->size; i++)
{