这里我将实现一个文件型通讯录,使得我们的通讯录能将信息保存在文件里。看起来更像一个通讯录管理系统。
我主要实现的功能有以下几点:
void InitContact(Contact* pcon); //初始化通讯录
void DstoryContact(Contact* pcon); //销毁通讯录
void AddContact(Contact* pcon); //添加联系人
void ShowContact(Contact* pcon); // 查看联系人
void DelContact(Contact* pcon); //删除联系人
void SaveContact(Contact* pcon); //保存联系人
void LoaContact(Contact* pcon); //加载文件
代码主要分为三部分:Contact.h Contact.c main.c
废话不多说,完整代码奉上:
Contact.h
#define _CRT_SECURE_NO_WARNINGS
#include`
#include
#include
#include
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include
#define DEFAULT_SZ 2
#define INC_SZ 3
#define MAX 1000
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
EMPTY,
SORT,
};
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDR_MAX 30
//定义一个结构体
typedef struct PeoInfo
{
char Name[NAME_MAX];
char Sex[SEX_MAX];
short int Age;
char Tele[TELE_MAX];
char Addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact
{
PeoInfo* data;
int sz;//通讯录中有效信息的个数
int capacity;//通讯录所能存放的最大容量
}Contact;
void InitContact(Contact* pcon); //初始化通讯录
void DstoryContact(Contact* pcon); //销毁通讯录
void AddContact(Contact* pcon); //添加联系人
void ShowContact(Contact* pcon); // 查看联系人
void DelContact(Contact* pcon); //删除联系人
void SaveContact(Contact* pcon); //保存联系人
void LoaContact(Contact* pcon); //加载文件
#endif //__CONTACT_H__
Contact.c
#include"Contact.h"
void InitContact(Contact* pcon) //初始化
{
assert(pcon != NULL);
pcon->sz = 0;
pcon->capacity = DEFAULT_SZ;
pcon->data = (PeoInfo*)malloc(pcon->capacity*sizeof(PeoInfo));
memset(pcon->data, 0, pcon->capacity*sizeof(PeoInfo));
}
void DstoryContact(Contact* pcon) //销毁
{
assert(pcon != NULL);
SaveContact(pcon);
free(pcon->data);
pcon->data = NULL;
pcon->sz = 0;
pcon->capacity = 0;
}
void LoaContact(Contact* pcon)//加载文件函数
{
assert(pcon != NULL);
int i = 0;
PeoInfo temp = { 0 };
FILE* pf = fopen("contact.dat", "rb");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return;
}
//读数据
while (fread(&temp, sizeof(PeoInfo), 1, pf))
{
CheckCapacity(pcon);
pcon->data[pcon->sz++] = temp;
}
fclose(pcon);
pcon = NULL;
}
void SaveContact(Contact* pcon)//保存文件函数
{
assert(pcon != NULL);
int i = 0;
FILE* pf = fopen("contact.dat", "wb");//创建并打开一个文件存储输入的通讯录信息
if (pf == NULL)//判断文件是否创建成功
{
printf("%s\n", strerror(errno));
return;
}
//向文件里写数据
for (i = 0; i < pcon->sz; i++)
{
fwrite(pcon->data + i, sizeof(PeoInfo), 1, pf);
}
fclose(pf);
pf = NULL;
}
int CheckCapacity(Contact* pcon) //检查容量函数
{
assert(pcon != NULL);
if (pcon->capacity == pcon->sz)
{
//增容
PeoInfo *ptr = (PeoInfo*)realloc(pcon->data, (pcon->capacity + INC_SZ)*sizeof(PeoInfo));
if (ptr != NULL)
{
pcon->data = ptr;
pcon->capacity += INC_SZ;
printf("增容成功!\n");
return 1;
}
else
{
return 0;
}
}
return 1;
}
void AddContact(Contact* pcon) //添加联系人
{
assert(pcon != NULL);
////增加容量函数
if (CheckCapacity(pcon) == 0)
{
printf("通讯录已满,尝试增容失败,无法添加!");
return;
}
else
{
printf("请输入名字:>");
scanf("%s", pcon->data[pcon->sz].Name);
printf("请输入性别:>");
scanf("%s", pcon->data[pcon->sz].Sex);
printf("请输入年龄:>");
scanf("%d", &pcon->data[pcon->sz].Age);
printf("请输入电话:>");
scanf("%s", pcon->data[pcon->sz].Tele);
printf("请输入地址:>");
scanf("%s", pcon->data[pcon->sz].Addr);
}
pcon->sz++;
printf("添加成功!\n");
}
void ShowContact(Contact* pcon) //查看联系人
{
assert(pcon != NULL);
int i = 0;
printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
for (i = 0; i < pcon->sz; i++)
{
printf("%-15s\t%-5s\t%-5d\t%-12s\t%-20s\n",
pcon->data[i].Name,
pcon->data[i].Sex,
pcon->data[i].Age,
pcon->data[i].Tele,
pcon->data[i].Addr
);
}
}
int FindEntry(Contact* 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(Contact* pcon) //删除联系人
{
assert(pcon != NULL);
char name[NAME_MAX] = { 0 };
int pos;
if (pcon->sz == 0)//判断该通讯录是否为空
{
printf("通讯录为空,无法删除!");
}
else
{
printf("请输入要删除人的名字:>");
scanf("%s", &name);
pos = FindEntry(pcon, name);
if (pos == -1)
{
printf("通讯录中无此人信息!\n");
}
else
{
//删除
int i = 0;
for (i = pos; i < pcon->sz - 1; i++)
{
pcon->data[i] = pcon->data[i + 1];
}
printf("删除成功!\n");
pcon->sz--;
}
}
}
main.c
#include"Contact.h"
//菜单函数
void menu()
{
printf("****************************************\n");
printf("******1、add 2、del *******\n");
printf("******3、search 3、modify *******\n");
printf("******5、show 6、empty *******\n");
printf("******7、sort 0、exit *******\n");
printf("****************************************\n");
}
void test()
{
int input = 0;
Contact con;
InitContact(&con);
LoaContact(&con);
do{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
break;
case MODIFY:
break;
case SHOW:
ShowContact(&con);
break;
case EMPTY:
break;
case SORT:
break;
case EXIT:
DstoryContact(&con);//利用free释放malloc开辟的空间
printf("退出通讯录!\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
}
int main()
{
test();
system("pause");
return 0;
}
欢迎大家关注我的博客哟~