通讯录3.0的实现,将通讯录的数据写入文件,并能保存文件,以解决联系人数据的存储问题
在实现文件操作之前先了解文件操作(本次工程所用)函数
文件操作函数的介绍(点击查看)
在工程目录下创建一个用以保存通讯录数据的.txt文件
下面是代码的编写
contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>
#define INIT_MAX 2 //初始容量
#define RISE_MAX 2 //每次增加的容量
typedef struct PeInfo
{
char name[20];
int age;
char sex[10];
char tele[15];
char addr[30];
}PeInfo;
typedef struct Contact
{
PeInfo *contact;
int capacity;
int sz;
}Contact, *pContact;
void Load_con(pContact p);//加载联系人信息
void Add_con(pContact p);// 添加联系人信息
void Dele_con(pContact p);//删除指定联系人信息
void Find_con(pContact p);//查找指定联系人信息
void Revise_con(pContact p);//修改指定联系人信息
void Display_con(pContact p);//显示所有联系人信息
void Empty_con(pContact p);//清空所有联系人
void Sort_con(pContact p);//以名字排序所有联系人
void Exit_con(pContact p);//结束程序
void adj(pContact p, int i);//写入数据 m
void Inc_capa(pContact p);//扩容函数
void Seve(pContact p);//保存数据在指定文件中
#endif //__CONTACT_H__
contact.c
#include"contact.h"
void Add_con(pContact p)//添加联系人信息
{
if(p->sz==p->capacity)
{
Inc_capa(p);
}
adj(p, p->sz);//写入数据
p->sz++;
}
void Inc_capa(pContact p)//扩容函数
{
PeInfo *tmp = (PeInfo*)realloc(p->contact,(p->capacity+RISE_MAX)*sizeof(PeInfo));//当内存不够时,扩充大小为(p->capacity + RISE_MAX)*sizeof(PeInfo))个字节的内存
if(tmp == NULL)
{
perror("out of memory\n");
exit(EXIT_FAILURE);
}
p->capacity += RISE_MAX;
p->contact=tmp;
printf("增容成功\n");
}
void adj(pContact p, int i)//写入数据
{
printf("请输入姓名:\n");
scanf("%s", p->contact[i].name);
printf("请输入年龄:\n");
scanf("%d", &(p->contact[i].age));
printf("请输入性别:\n");
scanf("%s", p->contact[i].sex);
printf("请输入电话:\n");
scanf("%s", p->contact[i].tele);
printf("请输入住址:\n");
scanf("%s", p->contact[i].addr);
}
void Load_con(pContact p)//加载联系人信息
{
PeInfo tmp={0};
FILE *pfread=fopen("contact.txt","r");//以读方式打开文件contact.txt
p->capacity=INIT_MAX; //初始化
p->sz = 0;//初始化
p->contact =(PeInfo*)malloc(INIT_MAX*sizeof(PeInfo));//开辟空间
if(p->contact == NULL)//错误报告
{
perror("out of memory\n");
exit(EXIT_FAILURE);
}
if(pfread==NULL)//错误报告
{
perror("open file for read\n");
exit(1);
}
while(fread(&tmp,sizeof(PeInfo),1,pfread))//每次在文件中读取1个PeInfo大小的元素并写入tmp
{
if(p->sz==p->capacity)
{
Inc_capa(p);//扩容函数
}
p->contact[p->sz]=tmp;//将tmp中数据写入开辟好的空间p->contact中
p->sz++;
}
printf("Loading Done\n");
fclose(pfread);
}
void Dele_con(pContact p)//删除指定联系人信息
{
int i=0;
int j=0;
char ch=0;
char name[20]={0};
if(p->sz==0)
{
printf("通讯录为空\n");
return;
}
while(1)
{
printf("输入删除对象姓名:");
scanf("%s", name);
for(i=0; i<p->sz; i++)
{
if(strcmp(name, p->contact[i].name)==0)
break;
}
if(i==p->sz)
{
printf("不存在\n");
return;
}
else
{
for(j=i; j<(p->sz-1); j++)
{
p->contact[j]=p->contact[j+1];
}
printf("删除成功\n");
p->sz--;
return;
}
}
}
void Find_con(pContact p)//查找指定联系人信息
{
int i=0;
char name[20]={0};
printf("所查找人姓名:");
scanf("%s", name);
for(i=0; i<p->sz; i++)
{
if(strcmp(name, p->contact[i].name)==0)
{
printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
printf("%15s%10d%10s%15s%20s\n",p->contact[i].name, p->contact[i].age, p->contact[i].sex,
p->contact[i].tele, p->contact[i].addr);
return;
}
}
if(i==p->sz)
printf("不存在\n");
return;
}
void Revise_con(pContact p)//修改指定联系人信息
{
int i=0;
char name[20]={0};
if(p->sz==0)
{
printf("通讯录为空");
return;
}
printf("输入修改对象姓名:");
scanf("%s", name);
for(i=0; i<p->sz; i++)
{
if(strcmp(name, p->contact[i].name)==0)
{
printf("要修改人信息:\n");
printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
printf("%15s%10d%10s%15s%20s\n",p->contact[i].name,
p->contact[i].age, p->contact[i].sex,
p->contact[i].tele, p->contact[i].addr);
printf("修改为:\n");
adj(p, i);
printf("修改完成\n");
return;
}
}
if(i==p->sz)
printf("不存在\n");
return;
}
void Display_con(pContact p)//显示所有联系人信息
{
int i=0;
printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
if(p->sz==0)
{
printf("空\n");
return ;
}
for(i=0; i<p->sz; i++)
{
printf("%15s%10d%10s%15s%20s\n",p->contact[i].name,
p->contact[i].age, p->contact[i].sex,
p->contact[i].tele, p->contact[i].addr);
}
}
void Empty_con(pContact p)//清空所有联系人
{
p->sz=0;
free(p);
}
void Sort_con(pContact p)//按字母排序所有联系人
{
int i = 0;
int j = 0;
for(i=0;i<p->sz-1;i++)
{
for(j=0;j<p->sz-1-i;j++)
{
if(strcmp(p->contact[j].name,p->contact[j+1].name)>0)
{
PeInfo temp;
temp = p->contact[j];
p->contact[j] = p->contact[j+1];
p->contact[j+1] = temp;
}
}
}
printf("排序完成\n");
return;
}
void Seve(pContact p)//保存联系人信息
{
int i=0;
FILE *pfwrite = fopen("contact.txt","w");
if(pfwrite==NULL)
{
perror("open for fwrite");
exit(1);
}
for(i=0; i<p->sz; i++)
{
fwrite(&(p->contact[i]),sizeof(PeInfo),1,pfwrite);
}
fclose(pfwrite);
}
void Exit_con(pContact p)//结束程序
{
Seve(p);
free(p->contact);
p->contact = NULL;
exit(0);
}
test.c
#include"contact.h"
void menu()//菜单打印
{
printf("**************************\n");
printf("***** 通 讯 录 *****\n");
printf("**************************\n");
printf("***** 1.添加 2.删除 *****\n");
printf("***** 3.查找 4.修改 *****\n");
printf("***** 5.列表 6.清空 *****\n");
printf("***** 7.排序 8.退出 *****\n");
printf("**************************\n");
}
int main()
{
Contact con;
int input = 0;
Load_con(&con);
do{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
Add_con(&con);
break;
case 2:
Dele_con(&con);
break;
case 3:
Find_con(&con);
break;
case 4:
Revise_con(&con);
break;
case 5:
Display_con(&con);
break;
case 6:
Empty_con(&con);
break;
case 7:
Sort_con(&con);
break;
case 8:
Exit_con(&con);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while(1);
return 0;
}
若有不当之处,恳请留言指正