通讯录——文件版

19 篇文章 0 订阅
6 篇文章 0 订阅

在之前已经写过了动态版的通讯录,要将此改为文件版本,只需增加两个函数,一个函数是将每次输入的内容写入文件内,另外一个函数是在每次打开该程序时读入文件内容

代码如下:

"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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值