在之前已经写过了动态版的通讯录,要将此改为文件版本,只需增加两个函数,一个函数是将每次输入的内容写入文件内,另外一个函数是在每次打开该程序时读入文件内容
代码如下:
"Contact.h"
#define _CRT_SECURE_NO_WARNINGS
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
enum po
{
EXIT,
ADD,
DELE,
SER,
MODIFY,
DISPLAY,
CLEAR,
SORT
};
#define NAME_MAX 100
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 25
#define MAX 1000 //通讯录的最大容量
#define DEFAULT 2 //通讯录首次的默认大小
#define ADD_SZ 2 //增容时每次增加的个数
#define DELE_SZ 1 //缩容时每次减小的个数
typedef struct Perfo
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
}Perfo;
typedef struct Contact
{
Perfo *data; //通讯录的大小
int size; //有效信息的个数
int capacity; //容量
}Con,*Pcon;
void init(Pcon pcon); //结构体初始化
void _destory(Pcon pcon); //释放
void _add(Pcon pcon); //插入
void _ser(Pcon pcon); //查找
void _dele(Pcon pcon); //删除
void _modify(Pcon pcon); //修改
void _display(Pcon pcon); //显示
void _clear(Pcon pcon); //清除
void _sort(Pcon pcon); //排序
void _save(Pcon pcon); //保存文件
void _load(Pcon pcon); //读文件
#endif //__CONTACT_H__
"Contact.c"
#define _CRT_SECURE_NO_WARNINGS
#include"Contact.h"
void init(Pcon pcon) //初始化
{
pcon->size = 0;
pcon->capacity = DEFAULT;
pcon->data = (Perfo*)malloc(pcon->capacity * sizeof(Perfo));
if(pcon->data == NULL)
{
printf("out of memory!\n");
exit(0);
}
memset(pcon->data,0,pcon->capacity*sizeof(Perfo));
_load(pcon);
}
void _expan(Pcon pcon) //增大容量
{
Perfo *temp = (Perfo *)realloc(pcon->data,(pcon->capacity+ADD_SZ)*sizeof(Perfo));
if(temp == NULL)
{
printf("out of memory!\n");
exit(0);
}
else
pcon->data = temp;
}
void _destory(Pcon pcon)
{
if(pcon->data != NULL)
{
free(pcon->data);
pcon->data = NULL;
}
}
void _add(Pcon pcon) //插入
{
Perfo *temp = NULL;
if(pcon->size == pcon->capacity)
{
_expan(pcon);
}
printf("请输入信息:姓名 性别 年龄 电话 住址\n");
scanf("%s",pcon->data[pcon->size].name);
scanf("%s",pcon->data[pcon->size].sex);
scanf("%d",&pcon->data[pcon->size].age);
scanf("%s",pcon->data[pcon->size].tele);
scanf("%s", pcon->data[pcon->size].addr);
pcon->size++;
printf("插入成功!\n");
}
int find(Pcon pcon,char *name) //为之后的ser函数和dele函数以及modify函数定义一个公共函数
{
int i = 0;
for(i = 0;i<pcon->size;i++)
{
if(strcmp(pcon->data[i].name,name) == 0)
return i;
}
return -1;
}
void _ser(Pcon pcon) //查找联系人
{
int ret = 0;
char name[NAME_MAX] = {0};
printf("请输入要查找的人的名字:");
scanf("%s",name);
ret = find(pcon,name);
if(ret == -1)
{
printf("不存在此人\n");
return ;
}
else
{
printf("%9s\t%5s\t%7d\t%12s\t%15s\n",
pcon->data[ret].name,
pcon->data[ret].sex,
pcon->data[ret].age,
pcon->data[ret].tele,
pcon->data[ret].addr);
}
}
void _display(Pcon pcon) //显示
{
int n = 0;
if(pcon->size <= 0)
{
printf("电话本空!\n");
}
else
{
printf("%10s\t%4s\t%3s\t%13s\t%10s\n","name","sex","age","tel","address");
for(n = 0;n<pcon->size;n++)
{
printf("%10s\t%4s\t%3d\t%13s\t%10s\n",
pcon->data[n].name,
pcon->data[n].sex,
pcon->data[n].age,
pcon->data[n].tele,
pcon->data[n].addr);
}
}
}
void _shrink(Pcon pcon) //减小容量
{
Perfo *temp = (Perfo *)realloc(pcon->data,(pcon->capacity-DELE_SZ)*sizeof(Perfo));
if(temp == NULL)
{
printf("电话本已空!\n");
return ;
}
else
pcon->data = temp;
}
void _dele(Pcon pcon) //删除
{
char name[NAME_MAX];
int ret = 0;
int i = 0;
printf("请输入要删除的人的姓名:");
scanf("%s",name);
ret = find(pcon,name);
if(ret == -1)
printf("不存在此人!\n");
else
{
for(i = ret;i<pcon->size;i++)
{
pcon->data[i] = pcon->data[i+1];
}
pcon->size--;
printf("删除成功!\n");
_shrink(pcon);
}
}
void _modify(Pcon pcon) //修改
{
int ret = 0;
char name[NAME_MAX];
printf("请输入要修改的人的姓名:");
scanf("%s",name);
ret = find(pcon,name);
if(ret == -1)
printf("不存在此人\n");
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].tele);
printf("请输入地址:>");
scanf("%s",pcon->data[ret].addr);
}
}
void _clear(Pcon pcon) //清空
{
pcon->size = 0;
printf("电话本已空!\n");
}
void _sort(Pcon pcon) // 排序
{
int i = 0;
int j = 0;
for(i = 0;i<pcon->size-1;i++)
{
for(j = 0;j<pcon->size-1-i;j++)
{
Perfo temp = {0};
if(strcmp(pcon->data[j].name,pcon->data[j+1].name)>0)
{
temp = pcon->data[j];
pcon->data[j] = pcon->data[j+1];
pcon->data[j+1] = temp;
}
}
}
}
void _save(Pcon pcon) //写入文件
{
int i = 0;
FILE *pfWrite = fopen("contact.txt","w"); //打开一个文件
if(pfWrite == NULL)
{
perror("open file for write");
exit(0);
}
else
{
for(i=0; i<pcon->size; i++)
{
fwrite(&(pcon->data[i]),sizeof(Perfo),1,pfWrite);
}
fclose(pfWrite);
}
}
void _load(Pcon pcon) //加载文件内容
{
Perfo temp = {0};
int i = 0;
FILE *pfRead = fopen("contact.txt","r");
if(pfRead == NULL)
{
perror("open file for read");
exit(0);
}
while(fread(&temp,sizeof(Perfo),1,pfRead))
{
_expan(pcon);
pcon->data[i] = temp;
i++;
pcon->size++;
}
}
"test.c"
#define _CRT_SECURE_NO_WARNINGS
#include "Contact.h"
void menu()
{
printf("--------- 0.exit ---------\n");
printf("--------- 1.add ----------\n");
printf("--------- 2.dele ---------\n");
printf("--------- 3.ser ----------\n");
printf("--------- 4.modify -------\n");
printf("--------- 5.display ------\n");
printf("--------- 6.clear --------\n");
printf("--------- 7.sort ---------\n");
}
int main()
{
int input = 1;
Con con;
init(&con);
menu();
while(input)
{
menu();
printf("请选择要操作的数字:");
scanf("%d",&input);
printf("\n");
{
switch(input)
{
case ADD:
_add(&con);
break;
case DELE:
_dele(&con);
break;
case SER:
_ser(&con);
break;
case MODIFY:
_modify(&con);
break;
case DISPLAY:
_display(&con);
break;
case CLEAR:
_clear(&con);
break;
case SORT:
_sort(&con);
break;
case EXIT:
_save(&con);
_destory(&con);
break;
default:
printf("无效选择!");
break;
}
}
}
system("pause");
return 0;
}