#define _CRT_SECURE_NO_WARNINGS 1
#include"address_book.h"
//读文件-加载文件
void read_file(Contact* pc)
{
FILE* pf = fopen("information.txt", "r");
//返回值判断
if (pf == NULL)
{
perror("read_file");
return;
}
//读文件
information tmp = {0};//问题:读文件停止(不知道你写入几个信息)?返回值的问题实际count
while (fread(&tmp, sizeof(information), 1, pf))//读不到返回0
{
//是否增容
Cap_inc(pc);
//存放增容元素
pc->date[pc->sz] = tmp;
//加载信息
pc->sz++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//动态版本进行初始化
void InitContact(Contact* pc)
{
pc->date = (information*)malloc(Defsz * sizeof(information));
if (pc->date == NULL)
{
perror("InitContact");
return;
}
//如果返回的为空指针的情况
pc->sz = 0;//sz初始化
pc->capacity = Defsz;//当前最大"容量"
//读文件-加载文件
read_file(pc);
}
//增容函数
void Cap_inc(Contact* pc)
{
//当记录当前通讯录有效信息的个数 等于 表示当前通讯录的最大"容量"大小。
if (pc->sz == pc->capacity)
{
//给堆区增加"容量",因为空间不够。
information* pa = (information*)realloc(pc->date, (pc->capacity + Inc)*(sizeof(information)));
if (pa != NULL)
{
pc->date = pa;//把这块空间移交到date进行维护
pc->capacity = pc->capacity + Inc;//由于这里我们进行了增容也需要把容量改变成+Inc的值
printf("增加联系人已成功(@^0^)\n");
}
//增容失败
else
{
perror("Add_Contact:");
printf("增加联系人失败!(ToT)/~~~\n");
return;
}
}
}
//动态版本增加
void Add_Contact(Contact* pc)
{
//检测容量
Cap_inc(pc);
//增加一个人的信息
printf("\n");
printf("请输入增加人的名字->:");
scanf("%s", pc->date[pc->sz].name);//注意→数组名是首元素地址,所以不用进行取地址.
printf("请输入增加人的年龄->:");
scanf("%s", pc->date[pc->sz].age);
printf("请输入增加人的性别->:");
scanf("%s", pc->date[pc->sz].genger);
printf("请输入增加人的电话->:");
scanf("%s", pc->date[pc->sz].telephone);
printf("请输入增加人的地址->:");
scanf("%s", pc->date[pc->sz].address);
//成功~
pc->sz++;
printf("★恭喜你~添加信息成功★\n");
printf("\n");
}
//读写信息到文件
void Save_Contact(Contact* pc)
{
FILE* pf = fopen("information.txt","w");
//返回值判断
if (pf == NULL)
{
perror("Save_Contact:");
return;
}
//写文件
int i = 0;
for (i = 0; i < pc->sz; i++)
{
//数组名+i就是数组名下标元素的地址。
fwrite(pc->date + i, sizeof(information), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
}
void Print_Contact(const Contact* pc)
{
int i = 0;
//打印标题栏的信息
printf("|-------------------------------------------------------|\n");
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", pc->date[i].name,
pc->date[i].age,
pc->date[i].genger,
pc->date[i].telephone,
pc->date[i].address);
}
}
static int FindByname(Contact* pc, char name[])
{
int i = 0;
//用for循环进行遍历
for (i = 0; i < pc->sz; i++)
{
//strcmp()比较字符串
if (strcmp(pc->date[i].name, name) == 0)
{
return i;//返回下标
}
}
return -1;
}
void DeLete_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
//通讯录为空的时候
if (pc->sz == 0)
{
printf("通讯录当中没有任何信息\n");
return;
}
printf("请输入你要删除的名字->:");
scanf("%s", name);
//查找要删除的人:有/没有
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("没有查找到当前人的信息\n");
return;
}
//删除
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->date[i] = pc->date[i + 1];
}
pc->sz--;//因为我们删除成功下标要减1
printf("★恭喜你~删除信息成功★\n");
printf("\n");
}
void Find_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
printf("请输入你要查找的名字->:");
scanf("%s", name);
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("没有查找到当前人的名字\n");
return;
}
else
{
printf("|-------------------------------------------------------|\n");
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n",
pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].genger,
pc->date[ret].telephone,
pc->date[ret].address);
printf("查找%sの信息成功~\n", pc->date[ret].name);
}
}
void Revise_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
printf("请输入你要修改通讯录人的名字->:");
scanf("%s", name);
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("当前修改人的信息不存在\n");
return;
}
else
{
printf("请输入修改人的名字->:");
scanf("%s", pc->date[ret].name);//注意→数组名是首元素地址,所以不用进行取地址.
printf("请输入修改人的年龄->:");
scanf("%s", pc->date[ret].age);
printf("请输入修改人的性别->:");
scanf("%s", pc->date[ret].genger);
printf("请输入修改人的电话->:");
scanf("%s", pc->date[ret].telephone);
printf("请输入修改人的地址->:");
scanf("%s", pc->date[ret].address);
printf("恭喜你,修改成功~\n");
}
}
int sort_name_max(const void* e1, const void* e2)
{
return (strcmp(((struct Contact*)e1)->date->name, ((struct Contact*)e2)->date->name));
}
void Check_Contact(Contact* pc)
{
//qosrt()函数首字母进行排序
qsort(pc->date, pc->sz, sizeof(pc->date[0]), sort_name_max);
printf("|-------------------------------------------------------|\n");
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", pc->date[i].name,
pc->date[i].age,
pc->date[i].genger,
pc->date[i].telephone,
pc->date[i].address);
}
}
void Destory_Contact(Contact* pc)
{
//销毁通讯录实际上就是把date给释放掉,free()函数进行回收即可。
free(pc -> date);
pc->date = NULL;
pc->sz = 0;
pc->capacity = 0;
//记得清0☆⌒(*^-゜)v THX!!
}