通讯录第三阶--文件版通讯录

前两次分别实现了静态和动态通讯录,可是当程序运行完之后所储存的信息就会消失,不能称为一个真正达到目的的通讯录,学习了文件操作章节之后,特将通讯录写成文件版,直接将数据保存到文件中,以后要用就可以直接使用,不用重复书写了。

代码如下:

Contact.h
#define _CRT_SECURE_NO_WARNINGS  
#ifndef __CONTACT_H__   
#define __CONTACT_H__   


#include <stdio.h>  
#include <assert.h>  
#include <string.h>  
#include <stdlib.h>  


#define MAX 3 //通讯录最大存储量  
#define NAME_MAX 20//名字最大长度   
#define SEX_MAX 5 //性别...  
#define ADDR_MAX 30 //地址...  
#define TELE_MAX 12 //电话...  
#define DEFAULT_SIZE 3//有效量  
#define DEFAULT_CIN 2//增长  
#define FILENAME "Contact.dat "

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 ShowContact(const pContact pcon); //展示  
void DelContact(pContact pcon); //删除  
void SearchContact(pContact pcon); //查找  
void ModifyContact(pContact pcon);//修改   
void SortContact(pContact pcon); //排序  
void ClearContact(pContact pcon);//清空   
void CheckCapacity(pContact pcon);//判断通讯录是否满了,满了进行增容  
void DestroyContact(pContact pcon);//销毁开辟的动态内存
void LoadContactData(pContact pcon);//加载文件数据
void SaveContactData(pContact pcon);//保存
void _Add(pContact pcon, PeoInfo *p);

#endif  

test.c
#define _CRT_SECURE_NO_WARNINGS  
#include "Contact.h"  
void menu()//菜单  
{  
	printf("*******************************************************\n");  
	printf("*************      1.ADD         2.DEL   **************\n");  
	printf("********           3.SEARCH      4..MODIFY     ********\n");  
	printf("*************      5.SHOW        6.CLEAR   ************\n");  
	printf("*************      7.SORT        8.LOAD  **************\n");  
	printf("*******************      0. EXIT  *********************\n");  
	printf("*******************************************************\n");  


}  
enum  
{  
	EXIT,//0 退出 
	ADD,//1  添加
	DEL,//2  删除
	SEARCH,//3  查找
	MODIFY,//4  修改
	SHOW,//5  展示
	CLEAR,//6  清空
	SORT,//7 按名字排序
	LOAD//8  读出文件中数据

};  
void test()  
{  
	
    int input = 0;  
	Contact my_con;
	InitContact(&my_con);//初始化通讯录  
	do   
	{  
		menu();//打印菜单  
		printf("请选择:>");  
		scanf("%d",&input);  
		switch (input)  
		{  
		case ADD:  
			AddContact(&my_con);  
			break;  
		case SHOW:  
			ShowContact(&my_con);  
			break;  
		case DEL:  
			DelContact(&my_con);  
			break;  
		case SEARCH:  
			SearchContact(&my_con);  
			break;  
		case MODIFY:  
			ModifyContact(&my_con);  
			break;  
		case CLEAR:  
			ClearContact(&my_con);  
			break;  
		case SORT:  
			SortContact(&my_con);  
			break;  
		case  EXIT: 
			SaveContactData(&my_con);
			DestroyContact(&my_con);  
			break;
		case  LOAD:
			LoadContactData(&my_con);
			break;
		default:  

			break;  

		}  
	} while (input);  
}  
int main()  
{  
	test();  

	return 0;  
}  


#define _CRT_SECURE_NO_WARNINGS  
#include "Contact.h"
void _Add(pContact pcon, PeoInfo *p)//
{
	CheckCapacity(pcon);
	pcon->data[pcon->sz] = *p;
	pcon->sz++;
}
void LoadContactData(pContact pcon)//加载文件数据
{
	FILE* pfIn = fopen(FILENAME, "r");
	PeoInfo tmp = {0};
	if (pfIn == NULL)
	{
		perror("LoadContactData::fopen");
		exit(EXIT_FAILURE);
	}
	while (fread(&tmp, sizeof(PeoInfo), 1, pfIn))
	{
		_Add(pcon, &tmp);
	}
	fclose(pfIn);
	ShowContact(pcon);
}
void SaveContactData(pContact pcon)//保存文件
{
	FILE* pfOut = fopen(FILENAME, "w");
	int i = 0;
	if (pfOut == NULL)
	{
		perror("SaveContactData::fopen");
		exit(EXIT_FAILURE);
	}
	for (i=0; i<pcon->sz; i++)
	{
		fwrite(pcon->data+i, sizeof(PeoInfo), 1, pfOut);
	}

	fclose(pfOut);
}
void InitContact(pContact pcon)//初始化通讯录  
{  
	
	pcon->sz = 0;  
	pcon->data = malloc(DEFAULT_SIZE*sizeof(PeoInfo));  
	if (pcon->data == NULL)  
	{  
		perror("malloc:");  
		exit(EXIT_FAILURE);  
	}  
	memset(pcon->data, 0, DEFAULT_SIZE*sizeof(PeoInfo));  
	pcon->capacity = DEFAULT_SIZE;

}  

void CheckCapacity(pContact pcon)//  
{  
	PeoInfo *str = NULL;  
	assert(pcon!=NULL);  
	if (pcon->sz == pcon->capacity)  
	{  

		str = realloc(pcon->data, (pcon->capacity+DEFAULT_CIN)*sizeof(PeoInfo));  
		if (str == NULL)  
		{  
			perror("realloc:");  
			exit(EXIT_FAILURE);  
		}  
		else  
		{  
			pcon->data = str;  
		}  
		pcon->capacity += DEFAULT_CIN;  
		printf("增容成功\n");  
	}  

}  
void AddContact(pContact pcon)//添加联系人  
{  
	assert(pcon!=NULL);  
	CheckCapacity(pcon);  
	printf("请输入姓名:>\n");  
	scanf("%s",pcon->data[pcon->sz].name);  
	printf("请输入性别:>\n");  
	scanf("%s",pcon->data[pcon->sz].sex);  
	printf("请输入年龄:>\n");  
	scanf("%d",&(pcon->data[pcon->sz].age));  
	printf("请输入地址:>\n");  
	scanf("%s",pcon->data[pcon->sz].addr);  
	printf("请输入电话:>\n");  
	scanf("%s",pcon->data[pcon->sz].tele);  
	pcon->sz++;  
	printf("录入成功!\n");  

}  
int find(pContact pcon,char name[])//通用的查找函数  
{  

	int i = 0;  
	assert(pcon!=NULL);  
	for (i=0; i<pcon->sz; i++)  
	{  
		if (strcmp(pcon->data[i].name ,name) == 0)  
		{  

			return i;  
		}  

	}  
	return -1;  

}  
void DelContact(pContact pcon)//删除联系人  
{  
	int ret = 0;  
	char name[NAME_MAX] = {0};  
	assert(pcon!=NULL);  
	printf("请输入要删除人的名字:>");  
	scanf("%s",name);  
	ret = find(pcon, name);  
	if (ret == -1)  
	{  
		printf("要查找的人不存在\n");  
		return;  
	}  
	else  
	{  
		int i =0;  
		for (i=ret; i<pcon->sz; i++)  
		{  
			pcon->data[i] = pcon->data[i+1];  
		}  
		pcon->sz--;  
		printf("删除成功\n");  
	}  


}  
void SearchContact(pContact pcon)//查找联系人  
{  
	int ret = 0;  
	char name[NAME_MAX] = {0};  
	assert(pcon!=NULL);  
	printf("请输入要查找的名字:>");  
	scanf("%s",name);  
	ret = find(pcon,name);  
	if (ret == -1)  
	{  
		printf("要查找的人不存在\n");  
		return;  
	}  
	else  
	{  
		printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");  

		printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[ret].name,   
			pcon->data[ret].sex,  
			pcon->data[ret].age,  
			pcon->data[ret].addr,   
			pcon->data[ret].tele);     


	}  

}  
void ModifyContact(pContact pcon)//修改联系人  
{  
	int ret = 0;  
	char name[NAME_MAX] = {0};  
	assert(pcon!=NULL);  
	printf("请输入要修改人的名字:>");  
	scanf("%s",name);  
	ret = find(pcon,name);  
	if (ret == -1)  
	{  
		printf("要查找的人不存在\n");  
	}  
	else  
	{  
		printf("请输入姓名:>\n");  
		scanf("%s",pcon->data[ret].name);  
		printf("请输入性别:>\n");  
		scanf("%s",pcon->data[ret].sex);  
		printf("请输入年龄:>\n");  
		scanf("%d",&(pcon->data[ret].age));  
		printf("请输入地址:>\n");  
		scanf("%s",pcon->data[ret].addr);  
		printf("请输入电话:>\n");  
		scanf("%s",pcon->data[ret].tele);  

	}  

}  
void ShowContact(const pContact pcon)//展示联系人  
{  

	int i = 0;  
	assert(pcon!=NULL);
	printf("%10s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "性别", "年龄", "地址", "电话");  
	for (i=0; i<pcon->sz; i++)  
	{  
		printf("%10s\t%5s\t%5d\t%15s\t%15s\n", pcon->data[i].name,   
			pcon->data[i].sex,  
			pcon->data[i].age,  
			pcon->data[i].addr,   
			pcon->data[i].tele);   
	}  

}  
void ClearContact(pContact pcon)//清空联系人  
{  
	assert(pcon!=NULL);  
	pcon->sz = 0;  
}  
void SortContact(pContact pcon)//按名字进行排序  
{  
	int i = 0;  
	int j = 0;  
	PeoInfo tmp;  
	assert(pcon!=NULL);  
	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)  
			{  
				tmp = pcon->data[j];  
				pcon->data[j] = pcon->data[j+1];  
				pcon->data[j+1] = tmp;  
			}  
		}  
	}  
	ShowContact(pcon);  
}  
void DestroyContact(pContact pcon)  
{  
	assert(pcon != NULL);  
	free(pcon->data);  
	pcon ->data= NULL;  
	pcon ->sz =  0;  
	pcon->capacity = 0;  
}  


说明:将数据录完后选择 0 退出即保存数据到文件中,下次想要使用时,先选择8进行加载,再进行操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值