之前写过通讯录的静态和动态版本,这两个版本都没有文件保存的功能,所以我们在使用的时候每次都需要重新输入,这样就显得很麻烦,所以这就需要文件版本的实现了,只需要在原来的动态版本上进行修改即可,在程序退出之前先保存文件即可。
以下是我的文件版本通讯录的代码,同样使用三个文件函数来实现:
Contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include <stdio.h>
#include <stdlib.h>
//#include <iostream>
#include<string.h>
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
#define Set_size 3
#define Incre_size 2
#define FILENAME "contact.txt"//文件名定义
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 CheckCapacity(pContact pcon);
void ShowContact(const pContact pcon);//显示联系人
void DelContact(pContact pcon);//删除指定联系人
void SearchContact(pContact pcon);//查找指定联系人
void ModifyContact(pContact pcon);//修改联系人信息
void SortContach(pContact pcon);//按姓名排序
void ClearContact(pContact pcon);//清空联系人
void FreeContact(pContact pcon);//释放动态开辟的内存
void LoadContactData(pContact pcon);//读取文件
void SaveContactData(pContact pcon);//保存文件
void _Add(pContact pcon, PeoInfo*p);
#endif
Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void CheckCapacity(pContact pcon);
void _Add(pContact pcon,PeoInfo *p)
{
CheckCapacity(pcon);
pcon->data[pcon->sz] = *p;
pcon->sz++;
}
void LoadContactData(pContact pcon)
{
FILE *pin = fopen(FILENAME, "rb");
PeoInfo tmp = { 0 };
if (pin == NULL)
{
perror("fopen");
/*return;*/
exit(EXIT_FAILURE);
}
while (fread(&tmp, sizeof(PeoInfo), 1, pin))
{
_Add(pcon, &tmp);
}
}
void SaveContactData(pContact pcon)
{
int i = 0;
FILE *pout = fopen(FILENAME,"wb");
if (pout == NULL)
{
perror("SaveContactData::fopen");
exit(EXIT_FAILURE);
}
for (i = 0; i < pcon->sz; i++)
{
fwrite(&(pcon->data [i]), sizeof(PeoInfo), 1, pout);
}
fclose(pout);
}
void InitContact(pContact pcon)
{
pcon->sz = 0;
pcon->data = malloc(Set_size*sizeof(PeoInfo));
if (pcon->data == NULL)
{
perror("malloc");
exit(EXIT_FAILURE);
}
memset(pcon->data, 0, Set_size*sizeof(PeoInfo));
pcon->capacity = Set_size;
LoadContactData(pcon);
}
void CheckCapacity(pContact pcon)
{
if (pcon->sz == pcon->capacity)
{
PeoInfo* ptr = realloc(pcon->data, (pcon->capacity + Incre_size)*sizeof(PeoInfo));
if (ptr == NULL)
{
perror("realloc");
exit(EXIT_FAILURE);
}
else
{
pcon->data = ptr;
}
pcon->capacity += Incre_size;
printf("增容成功\n");
}
}
void AddContact(pContact pcon)
{
CheckCapacity(pcon);
printf("输入联系人的信息:\n");
printf("姓名:");
scanf("%s", pcon->data[pcon->sz].name);
printf("年龄:");
scanf("%2d", &pcon->data[pcon->sz].age);
printf("性别:");
scanf("%s", pcon->data[pcon->sz].sex);
printf("地址:");
scanf("%s", pcon->data[pcon->sz].addr);
printf("电话:");
scanf("%s", pcon->data[pcon->sz].tele);
pcon->sz++;
printf("添加成功\n");
}
void FreeContact(pContact pcon)
{
free(pcon->data);
pcon -> data = NULL;
//pcon->sz = 0;
}
static int search(pContact pcon, char name[])//内部定义的查找函数
{
int i = 0;
for (i = 0; i < pcon->sz; i++)
{
if (strcmp(pcon->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//查找联系人
void SearchContact(pContact pcon)
{
int i = 0;
char name[NAME_MAX] = { 0 };
printf("请输入你要查找的名字:");
scanf("%s", name);
int ret = search(pcon, name);
if (ret == -1)
{
printf("没有您要查找的名字!\n");
return;
}
else
{
printf(" 姓名\t年龄\t性别\t地址\t电话\t\n");
//printf("\n");
printf("%s\t%d\t%s\t%s\t%s\t\n",
pcon->data[ret].name,
pcon->data[ret].age,
pcon->data[ret].sex,
pcon->data[ret].addr,
pcon->data[ret].tele);
}
}
//删除联系人
void DelContact(pContact pcon)
{
int i = 0;
char name[NAME_MAX] = { 0 };
printf("请输入你要删除的名字:");
scanf("%s", name);
int ret = search(pcon, name);
if (ret == -1)
{
printf("没有您要删除的姓名\n");
return;
}
else
{
for (i = ret; i < pcon->sz; i++)
{
pcon->data[i] = pcon->data[i + 1];
}
printf("删除成功!");
pcon->sz--;
}
}
//修改联系人信息
void ModifyContact(pContact pcon)
{
char name[NAME_MAX] = { 0 };
printf("请输入你要修改的名字:");
scanf("%s", name);
int ret = search(pcon, name);
if (ret == -1)
{
printf("没有您要修改的名字\n");
return;
}
else
{
printf("请输入姓名:");
scanf("%s", pcon->data[ret].name);
printf("请输入年龄:");
scanf("%d", &pcon->data[ret].age);
printf("请输入性别:");
scanf("%s", pcon->data[ret].sex);
printf("请输入地址:");
scanf("%s", pcon->data[ret].addr);
printf("请输入电话:");
scanf("%s", pcon->data[ret].tele);
printf("修改成功!");
}
}
//显示联系人
void ShowContact(const pContact pcon)
{
int i = 0;
printf("姓名\t年龄\t性别\t地址\t电话");
printf("\n");
for (i = 0; i < pcon->sz; i++)
{
printf("%s\t%d\t%s\t%s\t%s\t\n",
pcon->data[i].name, pcon->data[i].age,
pcon->data[i].sex, pcon->data[i].addr,
pcon->data[i].tele);
}
}
//清空联系人
void ClearContact(pContact pcon)
{
pcon->sz = 0;
memset(pcon->data, 0, sizeof(pcon->data));
printf("清空成功\n");
}
//按姓名排序
void SortContach(pContact pcon)
{
int i = 0;
int j = 0;
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)
{
PeoInfo tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
}
}
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void menu()
{
printf("\t********** 通讯录管理 **********\n");
printf("\t*** 1.添加联系人 2.查找联系人***\n");
printf("\t*** 3.删除联系人 4.修改联系人***\n");
printf("\t*** 5.清空联系人 6.显示联系人***\n");
printf("\t*** 7.按姓名排序 0.退出系统 ***\n");
printf("\t********** 请选择: ***********\n");
}
int main()
{
int input = 0;
Contact pcon;
InitContact(&pcon);
do{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&pcon);
break;
case 2:
SearchContact(&pcon);
break;
case 3:
DelContact(&pcon);
break;
case 4:
ModifyContact(&pcon);
break;
case 5:
ClearContact(&pcon);
break;
case 6:
ShowContact(&pcon);
break;
case 7:
SortContach(&pcon);
break;
case 0:
SaveContactData(&pcon);
FreeContact(&pcon);
exit(EXIT_FAILURE);
default:
break;
}
}
while (input != 0);
system("pause");
return 0;
}