一、使用多文件实现通讯录
1、头文件“Contact.h”
自己写的头文件:只要写包含库函数的头文件,和自己写的函数的声明,个人信息结构体,通讯录结构体,以及枚举,和宏定义。
#pragma once//防止头文件被重复包含
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#pragma warning(disable:4996)
//#define MAX 1000//最大通讯录存储数目
#define MAX_NAME 20//名字最大长度
#define MAX_AGE 5//年龄最大长度
#define MAX_SEX 5//性别最大长度
#define MAX_TELE 12//最长电话号码长度
#define MAX_ADDR 30//最大地址长度
#define CAPACITY_SZ 5//初始通讯录大小
enum Input//通讯录功能选择
{
EXITCONTACT,//0
ADDCONTACT,//1
DELCONTACT,
SEARCHCONTACT,
MODIFYCONTACT,
PRINTCONTACT,
SORTCONTACT,
SAVECONTACT
};//枚举0~7代表退出增删查改打印排序以及退出
typedef struct PerInfo//个人信息的结构体
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PerInfo;
struct Contact//通讯录结构体
{
int size;//已经存了多少个
int capacity;//通讯录总大小
PerInfo* date;//定义柔性数组
};
//函数声明
//菜单函数
void menu();
//初始化通讯录函数
void InitContact(struct Contact* ps);
//增加通讯录人的函数
void AddContact(struct Contact *ps);
//删除通讯录人的函数
void DelContact( struct Contact* ps);
//查找个人信息函数
void SearchContact(const struct Contact* ps);
//修改个人信息函数
void ModifyContact(struct Contact* ps);
//打印通讯录函数
void PrintContact(const struct Contact* ps);
//释放动态内存函数
void FreeContact(struct Contact *ps);
//保存通讯录到文件中函数
void SaveContact(struct Contact* ps);
//判断通讯录容量是否够用
void CheckCapacity(struct Contact* ps);
2、源文件
所有源文件逗得包含自己写的头文件,才能使用头文件里边的内容。
(1)main.c源文件
只要负责调试,调用函数,调试代码。
#include"Contect.h"
int main()
{//增加,删除,查找,修改,排序,打印
struct Contact con;//定义一个通讯录
InitContact(&con);//初始化
int input = 0;
do
{
menu();
printf("请选择:>\n");
scanf("%d", &input);
int pos = 0;
switch (input)//使用了枚举。
{case ADDCONTACT:
AddContact(&con);
break;
case DELCONTACT:
DelContact(&con);
break;
case SEARCHCONTACT:
SearchContact(&con);
break;
case MODIFYCONTACT:
ModifyContact(&con);
break;
case PRINTCONTACT:
PrintContact(&con);
break;
case SORTCONTACT:
break;
case EXITCONTACT:
SaveContact(&con);
FreeContact(&con);
break;
case SAVECONTACT:
SaveContact(&con);
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
(2)contact源文件
主要负责函数的实现
#include"Contect.h"
void menu()
{
printf("################################\n");
printf("## 1.Add 2.Div ##\n");
printf("## 3.Search 4.modify ##\n");
printf("## 5.Print 6.Sort ##\n");
printf("## 7.Save 0.Exit ##\n");
printf("################################\n");
}
void SaveContact(struct Contact* ps)
{
FILE* fpwrite = fopen("mycontact.date", "wb");
if (fpwrite == NULL)
{
printf("SaveContact::%s", strerror(errno));
return;
}
else//将通讯录文件保存在文件中
{
for (int i = 0; i < ps->size; i++)
{
fwrite(&(ps->date[i]), sizeof(PerInfo), 1, fpwrite);
}
}
fclose(fpwrite);
fpwrite = NULL;
}
void LoadContact(struct Contact* ps)
{
PerInfo temp = { 0 };
FILE* fpread = fopen("mycontact.date", "rb");
if (fpread == NULL)
{
printf("LoadContact::%s", strerror(errno));
return;
}
else
{
//初始化时将文件里的内容读进通讯录里
while (fread(&temp, sizeof(PerInfo), 1, fpread))
{
CheckCapacity(ps);
ps->date[ps->size] = temp;
ps->size++;
}
}
fclose(fpread);
fpread = NULL;
}
void InitContact(struct Contact *ps)
{
ps->date = (PerInfo*)malloc(CAPACITY_SZ * (sizeof(PerInfo)));
if (ps->date == NULL)
{
return;
}
else
{
ps->size = 0;//已存数目
ps->capacity = CAPACITY_SZ;//初始容量
}
LoadContact(ps);//加载文件中的内容
/*memset(ps->date, 0, sizeof(ps->date));
ps->size = 0;*/
}
//判断是否需要增容
void CheckCapacity(struct Contact* ps)
{
if ((ps->size) == (ps->capacity))//判断是否需要增容
{
//增容
PerInfo* pos = (PerInfo*)realloc(ps->date, (CAPACITY_SZ * 2)*sizeof(PerInfo));
if (pos != NULL)
{
printf("增容成功\n");
ps->date = pos;
ps->capacity = CAPACITY_SZ * 2;
}
else
{
printf("扩容失败\n");
}
}
}
void AddContact(struct Contact* ps)//增加函数
{
CheckCapacity(ps);//判断是否需要增容
printf("请输入名字:");
scanf(" %s", ps->date[ps->size].name);
printf("请输入年龄:");
scanf(" %d", &ps->date[ps->size].age);
printf("请输入性别:");
scanf(" %s", ps->date[ps->size].sex);
printf("请输入电话:");
scanf("%s", ps->date[ps->size].tele);
printf("请输入住址:");
scanf("%s", ps->date[ps->size].addr);
printf("添加成功\n");
ps->size++;
/*if (ps->size == MAX)
{
printf("空间已满,添加失败\n");
}
else
{
printf("请输入名字:" );
scanf(" %s", ps->date[ps->size].name);
printf("请输入年龄:");
scanf(" %d",& ps->date[ps->size].age);
printf("请输入性别:");
scanf(" %s", ps->date[ps->size].sex);
printf("请输入电话:");
scanf("%s", ps->date[ps->size].tele);
printf("请输入住址:");
scanf("%s", ps->date[ps->size].addr);
printf("添加成功\n");
ps->size++;
}
*/
}
void PrintContact(const struct Contact* ps)
{
if (ps->size == 0)
{
printf("通讯录为空\n");
}
else
{
printf("%-20s\t%sd\t%-5s\t%-12s\t%-30s\n",
"姓名", "年龄", "性别", "电话号码", "住址");
for (int i = 0; i < ps->size; i++)
{
printf("%-20s\t%4d\t%-5s\t%-12s\t%-30s\n",
ps->date[i].name,
ps->date[i].age,
ps->date[i].sex,
ps->date[i].tele,
ps->date[i].addr);
}
}
}
//寻找名字对应下标的函数
static int FindContact(const struct Contact* ps,char name[MAX_NAME])
{
int pos = 0;
for (pos = 0; pos < ps->size; pos++)
{
if (strcmp(ps->date[pos].name, name) == 0)
{
break;
}
}
if (pos == ps->size)
{
return -1;
}
else
{
return pos;
}
}
void DelContact(struct Contact*ps)
{
char name[MAX_NAME];
printf("请输入你要删的名字:>");
scanf("%s", name);
int pos = FindContact(ps, name);
if (pos == -1)
{
printf("你要删除的人不存在\n");
}
else
{
int j = 0;
for (j = pos; j < ps->size - 1; j++)
{
ps->date[j] = ps->date[j + 1];
}
ps->size--;
printf("删除成功\n");
}
}
void SearchContact(const struct Contact* ps)
{
char name[MAX_NAME];
printf("请输入你要查找的人名字:>");
scanf("%s", name);
int pos = FindContact(ps, name);
if (pos == -1)
{
printf("你要查找的人不存在\n");
}
else
{
printf("查找成功\n");
printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n",
"名字", "年龄", "性别", "电话号码", "住址");
printf("%-20s\t%-5d\t%-4s\t%-12s\t%-30s\n",
ps->date[pos].name, ps->date[pos].age,
ps->date[pos].sex, ps->date[pos].tele,
ps->date[pos].addr);
}
}
void ModifyContact(struct Contact* ps)
{
char name[MAX_NAME];
printf("请输入你要修改人的名字\n");
scanf("%s", name);
int pos = FindContact(ps, name);
if (pos == -1)
{
printf("你要修改的人信息不存在\n");
}
else
{
printf("请输入要修改的名字:");
scanf(" %s", ps->date[pos].name);
printf("请输入要修改的年龄:");
scanf(" %d", &ps->date[pos].age);
printf("请输入要修改的性别:");
scanf(" %s", ps->date[pos].sex);
printf("请输入要修改的电话:");
scanf("%s", ps->date[pos].tele);
printf("请输入要修改的住址:");
scanf("%s", ps->date[pos].addr);
printf("修改成功\n");
}
}
void FreeContact(struct Contact* ps)
{
free(ps->date);
ps->date = NULL;
}
二、测试结果
1、添加一个人
2、打印通讯录结果
3、删除一个人
先添加一个人
删除之后:
只有原来的一个了。
(4)修改信息
进行修改
修改之后:
(6)增容
我设置的通讯录初使大小是5;当超过5之后会自动扩容
当已经有5个时,在添加会扩容。
(7)保存在文件中
(8)再一次运行时会将文件中的内容放进通讯录中
这是上次运行时保存的。