void Save_contact(Pcon pcon) //将联系人信息保存到contact.dat中
{
int i=0;
FILE *pfwrite=fopen("contact.dat","w");
if(pfwrite == NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
for(i=0;i<pcon->size;i++)
{
fwrite(&(pcon->data[i]),sizeof(PerInfo),1,pfwrite);
}
fclose(pfwrite);
} 接下来就是如何加载信息了,代码实现如下:void Load_contact(Pcon pcon) //加载信息
{
int i=0;
PerInfo tmp={0};
FILE *pfread=fopen("contact.dat","r");
if(pfread == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
while(fread(&tmp,sizeof(PerInfo),1,pfread))
{
judge_full(pcon);
pcon->data[i]=tmp;
i++;
pcon->size++;
}
} 在这里附上程序源代码便于读者理解:#include"contact.h"
void menu()
{
printf("***************简易通讯录***************\n");
printf("****1.添加联系人*******2.删除联系人****\n");
printf("****3.查找联系人*******4.修改联系人****\n");
printf("****5.显示联系人*******6.清空联系人****\n");
printf("****7.以名字排序联系人*0.退出**********\n");
printf("***************************************\n");
}
int main()
{
Contact pcon;
int intput=1;
init(&pcon);
while(intput)
{
menu();
printf("请输入一个你要选择的操作:");
scanf("%d",&intput);
if(intput >= 0 && intput <= 7)
{
switch(intput)
{
case ADD:Add(&pcon);
break;
case DEL:Del(&pcon);
break;
case SEARCH:Search(&pcon);
break;
case REVISE:Revise(&pcon);
break;
case DISPLAY:Display(&pcon);
break;
case EMPTY:Empty(&pcon);
break;
case SORT:Sort_name(&pcon);
break;
case EXIT:
Save_contact(&pcon);
Free(&pcon);
break;
}
}
}
system("pause");
return 0;
} contach.h:#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_MAXNUM 20
#define SEX_MAXNUM 5
#define TELE_MAXNUM 12
#define ADDR_MAXNUM 10
#define MAX 1000
#define MAX_INIT 2
#define MAX_RISE 2
enum OP
{
EXIT,
ADD,
DEL,
SEARCH,
REVISE,
DISPLAY,
EMPTY,
SORT
};
typedef struct PerInfo
{
char name[NAME_MAXNUM];
int age;
char sex[SEX_MAXNUM];
char tele[TELE_MAXNUM];
char addr[ADDR_MAXNUM];
}PerInfo;
typedef struct Contact
{
PerInfo *data; //存储所有联系人的所有信息
int size; //记录联系人的个数
int capacity; //通讯录的容量
}Contact,*Pcon;
void init(Pcon pcon); //初始化
void Add(Pcon pcon); //添加联系人
void Del(Pcon pcon); //删除指定联系人
void Search(Pcon pcon); //查找指定联系人
void Revise(Pcon pcon); //修改指定联系人
void Display(Pcon pcon); //打印联系人信息
void Empty(Pcon pcon); //清空联系人信息
void Sort_name(Pcon pcon); //以名字排序所有联系人
void Free(Pcon pcon); //释放空间
void Save_contact(Pcon pcon);//在文件中存储联系人信息
void Load_contact(Pcon pcon);//加载联系人信息 contact.c:#include"contact.h"
void init(Pcon pcon)
{
pcon->data=(PerInfo *)malloc(MAX_INIT*sizeof(PerInfo));
if(pcon->data == NULL)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
memset(pcon->data,0,MAX_INIT*sizeof(PerInfo));
pcon->size=0;
pcon->capacity=MAX_INIT;
Load_contact(pcon);
}
void judge_full(Pcon pcon) //当实际联系人个数和初始化的容量相等时用realloc增容
{
if(pcon->size == pcon->capacity)
{
PerInfo *tmp=(PerInfo *)realloc(pcon->data,(pcon->capacity+MAX_RISE)*sizeof(PerInfo));
if(tmp == NULL)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
else
{
pcon->data=tmp;
pcon->capacity+=MAX_RISE;
}
}
}
void Add(Pcon pcon) //添加联系人
{
judge_full(pcon);
printf("请输入你添加之后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n");
scanf("%s",pcon->data[pcon->size].name);
scanf("%d",&(pcon->data[pcon->size].age));
scanf("%s",pcon->data[pcon->size].sex);
scanf("%s",pcon->data[pcon->size].tele);
scanf("%s",pcon->data[pcon->size].addr);
pcon->size++;
printf("添加成功\n");
}
int Find_position(Pcon pcon,char *str) //查找联系人函数
{
int i=0;
for(i=0;i<pcon->size;i++)
{
if(strcmp(pcon->data[i].name,str) == 0) //将要查找的姓名与通讯录里的联系人匹配,找到就返回下标
{
return i;
}
}
return -1;
}
void Del(Pcon pcon) //删除指定联系人
{
int ret=0;
int i=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要删除的联系人姓名:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
for(i=ret;i<pcon->size;i++)
{
pcon->data[i]=pcon->data[i+1]; //删除的元素之后的元素往前挪一个位置
}
pcon->size--;
}
else
{
printf("通讯录里没有此联系人\n");
return ;
}
}
void Search(Pcon pcon) //查找指定联系人
{
int ret=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要查找的联系人的名字:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
printf("查找成功\n");
}
else
{
printf("通讯录里无此人\n");
return ;
}
}
void Revise(Pcon pcon) //修改指定联系人
{
int ret=0;
char str[NAME_MAXNUM]={0};
printf("请输入你要修改的联系人的姓名:");
scanf("%s",str);
ret=Find_position(pcon,str);
if(ret != -1)
{
int input=0;
printf("请输入你要修改的信息:1.姓名2.年龄3.性别4.联系电话5.住址\n");
scanf("%d",&input);
switch(input)
{
case 1:printf("请输入修改后的名字:\n");
scanf("%s",pcon->data[ret].name);break;
case 2:printf("请输入修改后的年龄:\n");
scanf("%d",&(pcon->data[ret].age));break;
case 3:printf("请输入修改后的性别:\n");
scanf("%s",pcon->data[ret].sex);break;
case 4:printf("请输入修改后的联系电话:\n");
scanf("%s",pcon->data[ret].tele);break;
case 5:printf("请输入修改后的住址:\n");
scanf("%s",pcon->data[ret].addr);break;
default:printf("error");
break;
}
}
else
{
printf("通讯录里无此人\n");
return ;
}
}
void Display(Pcon pcon) //显示联系人信息
{
int i=0;
for(i=0;i<pcon->size;i++)
{
printf("%s %d %s %s %s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex, pcon->data[i].tele,pcon->data[i].addr);
}
}
void Empty(Pcon pcon) //清空联系人
{
pcon->size=0;
}
void Sort_name(Pcon pcon) //以名字排序联系人
{
int flag=0;
int i=0;
int j=0;
for(i=0;i<pcon->size-1;i++)
{
flag=0; //对冒泡排序的优化
for(j=0;j<pcon->size-1-i;j++)
{
if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) //默认升序排列
{
PerInfo tmp=pcon->data[j];
pcon->data[j]=pcon->data[j+1];
pcon->data[j+1]=tmp;
flag=1;
}
}
if(flag == 0)
break;
}
}
void Free(Pcon pcon)
{
free(pcon->data);
pcon->data=NULL;
exit(0);
}
void Save_contact(Pcon pcon) //将联系人信息保存到contact.dat中
{
int i=0;
FILE *pfwrite=fopen("contact.dat","w");
if(pfwrite == NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
for(i=0;i<pcon->size;i++)
{
fwrite(&(pcon->data[i]),sizeof(PerInfo),1,pfwrite);
}
fclose(pfwrite);
}
void Load_contact(Pcon pcon) //加载信息
{
int i=0;
PerInfo tmp={0};
FILE *pfread=fopen("contact.dat","r");
if(pfread == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
while(fread(&tmp,sizeof(PerInfo),1,pfread))
{
judge_full(pcon);
pcon->data[i]=tmp;
i++;
pcon->size++;
}
} 那仫代码是不是能够实现保存信息的功能呢?请看下图:
原文:http://blog.csdn.net/qq_34328833/article/details/51441079