前两次分别实现了静态和动态通讯录,可是当程序运行完之后所储存的信息就会消失,不能称为一个真正达到目的的通讯录,学习了文件操作章节之后,特将通讯录写成文件版,直接将数据保存到文件中,以后要用就可以直接使用,不用重复书写了。
代码如下:
Contact.h
#define _CRT_SECURE_NO_WARNINGS
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#define MAX 3 //通讯录最大存储量
#define NAME_MAX 20//名字最大长度
#define SEX_MAX 5 //性别...
#define ADDR_MAX 30 //地址...
#define TELE_MAX 12 //电话...
#define DEFAULT_SIZE 3//有效量
#define DEFAULT_CIN 2//增长
#define FILENAME "Contact.dat "
typedef struct PeoInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char addr[ADDR_MAX];
char tele[TELE_MAX];
}PeoInfo;//定义的新类型
typedef struct Contact
{
PeoInfo *data; //存储位置
int sz;//有效数据个数
int capacity;//容量
}Contact, *pContact;
void InitContact(pContact pcon); //初始化通讯录
void AddContact(pContact pcon); //添加
void ShowContact(const pContact pcon); //展示
void DelContact(pContact pcon); //删除
void SearchContact(pContact pcon); //查找
void ModifyContact(pContact pcon);//修改
void SortContact(pContact pcon); //排序
void ClearContact(pContact pcon);//清空
void CheckCapacity(pContact pcon);//判断通讯录是否满了,满了进行增容
void DestroyContact(pContact pcon);//销毁开辟的动态内存
void LoadContactData(pContact pcon);//加载文件数据
void SaveContactData(pContact pcon);//保存
void _Add(pContact pcon, PeoInfo *p);
#endif
test.c
#define _CRT_SECURE_NO_WARNINGS
#include "Contact.h"
void menu()//菜单
{
printf("*******************************************************\n");
printf("************* 1.ADD 2.DEL **************\n");
printf("******** 3.SEARCH 4..MODIFY ********\n");
printf("************* 5.SHOW 6.CLEAR ************\n");
printf("************* 7.SORT 8.LOAD **************\n");
printf("******************* 0. EXIT *********************\n");
printf("*******************************************************\n");
}
enum
{
EXIT,//0 退出
ADD,//1 添加
DEL,//2 删除
SEARCH,//3 查找
MODIFY,//4 修改
SHOW,//5 展示
CLEAR,//6 清空
SORT,//7 按名字排序
LOAD//8 读出文件中数据
};
void test()
{
int input = 0;
Contact my_con;
InitContact(&my_con);//初始化通讯录
do
{
menu();//打印菜单
printf("请选择:>");
scanf("%d",&input);
switch (input)
{
case ADD:
AddContact(&my_con);
break;
case SHOW:
ShowContact(&my_con);
break;
case DEL:
DelContact(&my_con);
break;
case SEARCH:
SearchContact(&my_con);
break;
case MODIFY:
ModifyContact(&my_con);
break;
case CLEAR:
ClearContact(&my_con);
break;
case SORT:
SortContact(&my_con);
break;
case EXIT:
SaveContactData(&my_con);
DestroyContact(&my_con);
break;
case LOAD:
LoadContactData(&my_con);
break;
default:
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include "Contact.h"
void _Add(pContact pcon, PeoInfo *p)//
{
CheckCapacity(pcon);
pcon->data[pcon->sz] = *p;
pcon->sz++;
}
void LoadContactData(pContact pcon)//加载文件数据
{
FILE* pfIn = fopen(FILENAME, "r");
PeoInfo tmp = {0};
if (pfIn == NULL)
{
perror("LoadContactData::fopen");
exit(EXIT_FAILURE);
}
while (fread(&tmp, sizeof(PeoInfo), 1, pfIn))
{
_Add(pcon, &tmp);
}
fclose(pfIn);
ShowContact(pcon);
}
void SaveContactData(pContact pcon)//保存文件
{
FILE* pfOut = fopen(FILENAME, "w");
int i = 0;
if (pfOut == NULL)
{
perror("SaveContactData::fopen");
exit(EXIT_FAILURE);
}
for (i=0; i<pcon->sz; i++)
{
fwrite(pcon->data+i, sizeof(PeoInfo), 1, pfOut);
}
fclose(pfOut);
}
void InitContact(pContact pcon)//初始化通讯录
{
pcon->sz = 0;
pcon->data = malloc(DEFAULT_SIZE*sizeof(PeoInfo));
if (pcon->data == NULL)
{
perror("malloc:");
exit(EXIT_FAILURE);
}
memset(pcon->data, 0, DEFAULT_SIZE*sizeof(PeoInfo));
pcon->capacity = DEFAULT_SIZE;
}
void CheckCapacity(pContact pcon)//
{
PeoInfo *str = NULL;
assert(pcon!=NULL);
if (pcon->sz == pcon->capacity)
{
str = realloc(pcon->data, (pcon->capacity+DEFAULT_CIN)*sizeof(PeoInfo));
if (str == NULL)
{
perror("realloc:");
exit(EXIT_FAILURE);
}
else
{
pcon->data = str;
}
pcon->capacity += DEFAULT_CIN;
printf("增容成功\n");
}
}
void AddContact(pContact pcon)//添加联系人
{
assert(pcon!=NULL);
CheckCapacity(pcon);
printf("请输入姓名:>\n");
scanf("%s",pcon->data[pcon->sz].name);
printf("请输入性别:>\n");
scanf("%s",pcon->data[pcon->sz].sex);
printf("请输入年龄:>\n");
scanf("%d",&(pcon->data[pcon->sz].age));
printf("请输入地址:>\n");
scanf("%s",pcon->data[pcon->sz].addr);
printf("请输入电话:>\n");
scanf("%s",pcon->data[pcon->sz].tele);
pcon->sz++;
printf("录入成功!\n");
}
int find(pContact pcon,char name[])//通用的查找函数
{
int i = 0;
assert(pcon!=NULL);
for (i=0; i<pcon->sz; i++)
{
if (strcmp(pcon->data[i].name ,name) == 0)
{
return i;
}
}
return -1;
}
void DelContact(pContact pcon)//删除联系人
{
int ret = 0;
char name[NAME_MAX] = {0};
assert(pcon!=NULL);
printf("请输入要删除人的名字:>");
scanf("%s",name);
ret = find(pcon, name);
if (ret == -1)
{
printf("要查找的人不存在\n");
return;
}
else
{
int i =0;
for (i=ret; i<pcon->sz; i++)
{
pcon->data[i] = pcon->data[i+1];
}
pcon->sz--;
printf("删除成功\n");
}
}
void SearchContact(pContact pcon)//查找联系人
{
int ret = 0;
char name[NAME_MAX] = {0};
assert(pcon!=NULL);
printf("请输入要查找的名字:>");
scanf("%s",name);
ret = find(pcon,name);
if (ret == -1)
{
printf("要查找的人不存在\n");
return;
}
else
{
printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");
printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[ret].name,
pcon->data[ret].sex,
pcon->data[ret].age,
pcon->data[ret].addr,
pcon->data[ret].tele);
}
}
void ModifyContact(pContact pcon)//修改联系人
{
int ret = 0;
char name[NAME_MAX] = {0};
assert(pcon!=NULL);
printf("请输入要修改人的名字:>");
scanf("%s",name);
ret = find(pcon,name);
if (ret == -1)
{
printf("要查找的人不存在\n");
}
else
{
printf("请输入姓名:>\n");
scanf("%s",pcon->data[ret].name);
printf("请输入性别:>\n");
scanf("%s",pcon->data[ret].sex);
printf("请输入年龄:>\n");
scanf("%d",&(pcon->data[ret].age));
printf("请输入地址:>\n");
scanf("%s",pcon->data[ret].addr);
printf("请输入电话:>\n");
scanf("%s",pcon->data[ret].tele);
}
}
void ShowContact(const pContact pcon)//展示联系人
{
int i = 0;
assert(pcon!=NULL);
printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");
for (i=0; i<pcon->sz; i++)
{
printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[i].name,
pcon->data[i].sex,
pcon->data[i].age,
pcon->data[i].addr,
pcon->data[i].tele);
}
}
void ClearContact(pContact pcon)//清空联系人
{
assert(pcon!=NULL);
pcon->sz = 0;
}
void SortContact(pContact pcon)//按名字进行排序
{
int i = 0;
int j = 0;
PeoInfo tmp;
assert(pcon!=NULL);
for (i=0; i<pcon->sz; i++)
{
for (j=0; j<pcon->sz-i-1; j++)
{
if (strcmp(pcon->data[j].name, pcon->data[j+1].name)>0)
{
tmp = pcon->data[j];
pcon->data[j] = pcon->data[j+1];
pcon->data[j+1] = tmp;
}
}
}
ShowContact(pcon);
}
void DestroyContact(pContact pcon)
{
assert(pcon != NULL);
free(pcon->data);
pcon ->data= NULL;
pcon ->sz = 0;
pcon->capacity = 0;
}
说明:将数据录完后选择 0 退出即保存数据到文件中,下次想要使用时,先选择8进行加载,再进行操作