文件型通讯录

                                       文件型通讯录

可创建一个文件保存输入的通讯录信息,重新执行程序时可自动加载
通讯录的头文件Contact.h

#define _CRT_SECURE_NO_WARNINGS
#include<string.h>`
#include<assert.h>
#include<stdio.h>
#include<errno.h>
#ifndef __CONTACT_H__
#define __CONTACT_H__

#include<stdlib.h>
#define DEFAULT_SZ 2
#define INC_SZ 3
#define MAX 1000
enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	EMPTY,
	SORT,
};
#define NAME_MAX 20
#define SEX_MAX 10
#define TELE_MAX 20
#define ADDR_MAX 30
//定义一个结构体
typedef struct PeoInfo
{
	char Name[NAME_MAX];
	char Sex[SEX_MAX];
	short int Age;
	char Tele[TELE_MAX];
	char Addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact
{
	PeoInfo* data;
	int sz;//通讯录中有效信息的个数
	int capacity;//通讯录所能存放的最大容量
}Contact;

void InitContact(Contact* pcon);
void DstoryContact(Contact* pcon);
void AddContact(Contact* pcon);
void ShowContact(Contact* pcon);
void DelContact(Contact* pcon);
void SaveContact(Contact* pcon);
void LoaContact(Contact* pcon);

#endif //__CONTACT_H__

通讯录的函数实现Contact.c

#include"Contact.h"
void InitContact(Contact* pcon)
{
	assert(pcon != NULL);
	pcon->sz = 0;
	pcon->capacity = DEFAULT_SZ;
	pcon->data = (PeoInfo*)malloc(pcon->capacity*sizeof(PeoInfo));
	memset(pcon->data, 0, pcon->capacity*sizeof(PeoInfo));

}
void DstoryContact(Contact* pcon)
{
	assert(pcon != NULL);
	SaveContact(pcon);
	free(pcon->data);
	pcon->data = NULL;
	pcon->sz = 0;
	pcon->capacity = 0;
}
void LoaContact(Contact* pcon)//加载文件函数
{
	assert(pcon != NULL);
	int i = 0;
	PeoInfo temp = { 0 };
	FILE* pf = fopen("contact.dat", "rb");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	//读数据
	while (fread(&temp, sizeof(PeoInfo), 1, pf))
	{
		CheckCapacity(pcon);
		pcon->data[pcon->sz++] = temp;
	}
	fclose(pcon);
	pcon = NULL;
}

void SaveContact(Contact* pcon)//保存文件函数
{
	assert(pcon != NULL);
	int i = 0;
	FILE* pf = fopen("contact.dat", "wb");//创建并打开一个文件存储输入的通讯录信息
	if (pf == NULL)//判断文件是否创建成功
	{
		printf("%s\n", strerror(errno));
		return;
	}
	//向文件里写数据
	for (i = 0; i < pcon->sz; i++)
	{
		fwrite(pcon->data + i, sizeof(PeoInfo), 1, pf);
	}
	fclose(pf);
	pf = NULL;
}

int CheckCapacity(Contact* pcon)//增加容量函数
{
	assert(pcon != NULL);
	if (pcon->capacity == pcon->sz)
	{
		//增容
		PeoInfo *ptr = (PeoInfo*)realloc(pcon->data, (pcon->capacity + INC_SZ)*sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pcon->data = ptr;
			pcon->capacity += INC_SZ;
			printf("增容成功!\n");
			return 1;
		}
		else
		{
			return 0;
		}
	}
	return 1;
}

void AddContact(Contact* pcon)
{
	assert(pcon != NULL);
	////增加容量函数
	if (CheckCapacity(pcon) == 0)
	{
		printf("通讯录已满,尝试增容失败,无法添加!");
		return;
	}
	else
	{
		printf("请输入名字:>");
		scanf("%s", pcon->data[pcon->sz].Name);
		printf("请输入性别:>");
		scanf("%s", pcon->data[pcon->sz].Sex);
		printf("请输入年龄:>");
		scanf("%d", &pcon->data[pcon->sz].Age);
		printf("请输入电话:>");
		scanf("%s", pcon->data[pcon->sz].Tele);
		printf("请输入地址:>");
		scanf("%s", pcon->data[pcon->sz].Addr);
	}
	pcon->sz++;
	printf("添加成功!\n");
}
void ShowContact(Contact* pcon)
{
	assert(pcon != NULL);
	int i = 0;
	printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%-15s\t%-5s\t%-5d\t%-12s\t%-20s\n",
			pcon->data[i].Name,
			pcon->data[i].Sex,
			pcon->data[i].Age,
			pcon->data[i].Tele,
			pcon->data[i].Addr
			);
	}
}
int FindEntry(Contact* 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(Contact* pcon)
{
	assert(pcon != NULL);
	char name[NAME_MAX] = {0};
	int pos;
	if (pcon->sz == 0)//判断该通讯录是否为空
	{
		printf("通讯录为空,无法删除!");
	}
	else
	{
		printf("请输入要删除人的名字:>");
		scanf("%s", &name);
		pos = FindEntry(pcon, name);
		if (pos == -1)
		{
			printf("通讯录中无此人信息!\n");
		}
		else
		{
			//删除
			int i = 0;
			for (i = pos; i < pcon->sz - 1; i++)
			{
				pcon->data[i] = pcon->data[i + 1];
			}
			printf("删除成功!\n");
			pcon->sz--;
		}
	}
}

通讯录的主函数部分main.c

#include"Contact.h"
//菜单函数
void menu()
{
	printf("****************************************\n");
	printf("******1、add         2、del      *******\n");
	printf("******3、search      3、modify   *******\n");
	printf("******5、show        6、empty    *******\n");
	printf("******7、sort        0、exit     *******\n");
	printf("****************************************\n");
}
void test()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	LoaContact(&con);
	do{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			DelContact(&con);
			break;
		case SEARCH:
			break;
		case MODIFY:
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case EMPTY:
			break;
		case SORT:
			break;
		case EXIT:
			DstoryContact(&con);//利用free释放malloc开辟的空间
			printf("退出通讯录!\n");
			break;

		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/chenxiyuehh/article/details/84593659