通讯录2.0版本来了文件版——C语言实现简单通讯录文件版(基于顺序表)

举报
未见花闻 发表于 2022/11/30 21:56:16 2022/11/30
【摘要】 ⭐️前面的话⭐️大家好!上次博主介绍了动态与静态版的通讯录,虽然动态版通讯录能够无限地读取联系人,但是程序结束后数据都没有了,这样的通讯录用起来真的是超级难受,所以通讯录2.0出来了,能够将数据自动存入文件中,并且程序关闭再打开会自动读取保存上次的联系人信息。这篇文章将在动态通讯录的基础上魔改,进化成能够自动保存的通讯录。 🍸1.文件版通讯录 🍹1.1设计目的前面介绍了静态版与动态版的通...

⭐️前面的话⭐️

大家好!上次博主介绍了动态与静态版的通讯录,虽然动态版通讯录能够无限地读取联系人,但是程序结束后数据都没有了,这样的通讯录用起来真的是超级难受,所以通讯录2.0出来了,能够将数据自动存入文件中,并且程序关闭再打开会自动读取保存上次的联系人信息。这篇文章将在动态通讯录的基础上魔改,进化成能够自动保存的通讯录。

🍸1.文件版通讯录

🍹1.1设计目的

前面介绍了静态版与动态版的通讯录,但是这些版本通讯录并不能对数据进行存储与读取,解决方法是使用文件的读写来进行数据的读取与储存。

  • [ ] 能储存联系人的一些基本信息,例如:姓名,性别,年龄,电话,地址,邮箱等。
  • [ ] 能够对通讯录进行添加,删除,修改,查找,排序,查看联系人。
  • [ ] 拥有一个简洁的联系人信息查看页面。
  • [ ] 弥补静态通讯录在空间上的不足,能够根据联系人数量动态调整通讯录大小。
  • [ ] 能够读取与储存数据,做到关闭程序数据依然存在。
  • [ ] 使用方便,简单。

🍹1.2菜单设计

这块不多介绍,运用输出函数显示一个菜单。

*******************************
*****    通讯录2.0 文件版 *****
*****    1 添加联系人     *****
*****    2 删除联系人     *****
*****    3 查找联系人     *****
*****    4 修改联系人信息 *****
*****    5 排序联系人信息 *****
*****    6 显示联系人信息 *****
*****    0 退出并保存     *****
*******************************
请输入菜单功能序号:
void menu()
{
	printf("*******************************\n");
	printf("*****    通讯录2.0 文件版 *****\n");
	printf("*****    1 添加联系人     *****\n");
	printf("*****    2 删除联系人     *****\n");
	printf("*****    3 查找联系人     *****\n");
	printf("*****    4 修改联系人信息 *****\n");
	printf("*****    5 排序联系人信息 *****\n");
	printf("*****    6 显示联系人信息 *****\n");
	printf("*****    0 退出并保存     *****\n");
	printf("*******************************\n");
}
enum Founction
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};

struct AddressBook student;

int main()
{
	int input = 0;
	InitContact(&student);
	do
	{
		menu();
		printf("请输入菜单功能序号:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&student);
			break;
		case DEL:
			DelContact(&student);
			break;
		case SEARCH:
			FindContact(&student);
			break;
		case MODIFY:
			ModContact(&student);
			break;
		case SORT:
			SotrContact(&student);
			break;
		case SHOW:
			ShowContact(&student);
			break;
		case EXIT:
			printf("退出通讯录成功!");
			SaveContact(&student);
			break;
		default:
			printf("输入字符非法!请重新输入!\n");
			break;
		}

	} while (input);
	return 0;
}

🍹1.3联系人信息设计

这个模块与前面动态通讯录一致。

✨1.3.1联系人信息结构

typedef struct Contact
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tel[MAX_TEL];
	char address[MAX_ADDR];
	char email[MAX_EMAIL];
}Con;

typedef struct AddressBook
{
	struct Contact* ListMan;
	int number;
	int capacity;
}AdBook;

✨1.3.2宏与文件包含信息

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

#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30
#define INIT_CON 5
#define ADD_CON 5

🍹1.4各功能函数声明

//加载通讯录
void LoadContact(AdBook* pAdBook);
//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook);
//销毁通讯录
void DestoryContact(AdBook* pAdBook);
//联系人信息打印
void PrintContact(AdBook* pAdBook, int index);
//联系人输入
void InputContact(Con* tmp);
//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name);
//联系人初始化
void InitContact(AdBook* pAdBook);
//增加联系人
void AddContact(AdBook* pAdBook);
//删除联系人
void DelContact(AdBook* pAdBook);
//修改联系人
void ModContact(AdBook* pAdBook);
//显示联系人
void ShowContact(AdBook* pAdBook);
//查找联系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函数
int cmp(const void* e1, const void* e2);
//排序联系人
void SotrContact(AdBook* pAdBook);
//保存通讯录
void SaveContact(AdBook* pAdBook);

🍹1.5通讯录2.0的变化

最大的变化就是能够把数据导出成文本,并且能够读取上一次保留的数据。

🍸2.文件版通讯录基础功能从理论到实践

🍹2.1联系人的查找,显示与销毁

这一部分与上一代动态通讯录是一模一样,没有一点点改变,所以不详细说明。

✨2.1.1联系人显示

//显示联系人
void ShowContact(AdBook* pAdBook)
{
	assert(pAdBook);

	printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex,
			pAdBook->ListMan[i].age,
			pAdBook->ListMan[i].tel,
			pAdBook->ListMan[i].address,
			pAdBook->ListMan[i].email);
	}
}

✨2.1.2联系人查找

//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
		return -1;
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		if (strcmp(pAdBook->ListMan[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
//联系人信息打印
void PrintContact(AdBook* pAdBook, int index)
{
	assert(pAdBook);
	printf("            你的好友%10s   信息如下         \n", pAdBook->ListMan[index].name);
	int i = 0;
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "性别", pAdBook->ListMan[index].sex);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38d |\n", "年龄", pAdBook->ListMan[index].age);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "电话", pAdBook->ListMan[index].tel);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "邮箱", pAdBook->ListMan[index].email);
	printf("--------------------------------------------------\n");
}
//查找联系人
void FindContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number == 0)
	{
		printf("联系人列表为空,无法进行查找!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("请输入需要查找的联系人姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		PrintContact(pAdBook, ret);
	}
	else
	{
		printf("查无此人!\n");
	}
}

✨2.1.3通讯录销毁

//销毁通讯录
void DestoryContact(AdBook* pAdBook)
{
	assert(pAdBook);

	free(pAdBook->ListMan);
	pAdBook->ListMan = NULL;
	pAdBook->capacity = 0;
	pAdBook->number = 0;
}

🍹2.2联系人数据加载与保存

由于我们的数据是保存在文件中的,那当然少不了对数据进行加载与保存。

✨2.2.1通讯录数据加载

数据是以二进制形式储存在文件中的,要对数据进行加载,那肯定需要打开文件并读取文件具体内容。
整个加载过程可以分成三步:

  1. 打开文件
  2. 对文件数据进行读取
  3. 关闭文件
//加载通讯录
void LoadContact(AdBook* pAdBook)
{
	assert(pAdBook);
	FILE* pf = fopen("contact.txt", "rb");//open file
	if (pf == NULL)
	{
		perror("file open read");
		printf("数据加载失败!默认建立空通讯录!\n");
		return;
	}
	Con tmp = { 0 };
	while (fread(&tmp, sizeof(Con), 1, pf))
	{
		if (pAdBook->capacity == pAdBook->number)
		{
			IncreaseContact(pAdBook);
		}

		pAdBook->ListMan[pAdBook->number] = tmp;//scanf data
		pAdBook->number++;
	}
	fclose(pf);//close file
	pf = NULL;
}

✨2.2.2通讯录数据保存

数据的保存实质上就是数据写入文件,这里我们分两种情况对文件进行写入:

  1. 二进制数据写入,用于计算机加载通讯录
  2. 文本数据写入,用于用户提取通讯录联系人
//保存通讯录
void SaveContact(AdBook* pAdBook)
{
	assert(pAdBook);

	FILE* pf = fopen("contact.txt", "wb");//二进制数据保存,用于计算机读取
	FILE* pf_read = fopen("通讯录.txt", "w+");//文本数据保存,用于用户阅读
	if (pf == NULL || pf_read == NULL)
	{
		perror("file write:");
		exit(-1);
	}
	int i = 0;
	fprintf(pf_read, "%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
	for (i = 0; i < pAdBook->number; i++)
	{
		fwrite(pAdBook->ListMan + i, sizeof(Con), 1, pf);//计算机数据
		fprintf(pf_read, "%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex,
			pAdBook->ListMan[i].age,
			pAdBook->ListMan[i].tel,
			pAdBook->ListMan[i].address,
			pAdBook->ListMan[i].email);//用户数据
	}
	fclose(pf);
	fclose(pf_read);
	pf = NULL;
	pf_read = NULL;
}

🍹2.3联系人初始化,新建,修改与排序

对于联系人的初始化,在动态版通讯录基础上需要对二进制文件数据进行加载,所以初始化过程最后还需要加载数据。而新建联系人,修改联系人,排序联系人。都对数据进行了变动,因此最后需要对改动后的数据进行保存,其他过程实现都没有变动。注意!初始化中的加载与新建联系人都有可能遇到通讯录满的问题,所以加载和新建联系人之前需要判断通讯录是否满,如果满了需要增容。

✨2.3.1通讯录数据初始化与加载

//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook)
{
	assert(pAdBook);

	Con* p = (Con*)realloc(pAdBook->ListMan, sizeof(Con) * (pAdBook->capacity + ADD_CON));
	if (p == NULL)
	{
		printf("通讯录扩容失败!\n");
		exit(-1);
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->capacity += ADD_CON;
		p = NULL;
	}
}
//联系人初始化
void InitContact(AdBook* pAdBook)
{
	assert(pAdBook);

	pAdBook->capacity = INIT_CON;
	Con* p = (Con*)malloc(sizeof(Con) * pAdBook->capacity);
	if (p == NULL)
	{
		printf("初始申请内存失败!\n");
		exit(-1);//程序没必要继续下去,直接终止
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->number = 0;
		p = NULL;
	}
	printf("联系人加载中!\n");
	LoadContact(pAdBook);
	printf("联系人加载完成!\n");
}

✨2.3.2通讯录新建联系人

//增加联系人
void AddContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->capacity == pAdBook->number)
	{
		IncreaseContact(pAdBook);
	}
	Con tmp = { 0 };
	InputContact(&tmp);
	pAdBook->ListMan[pAdBook->number] = tmp;
	pAdBook->number++;
	printf("新建联系人成功!\n");

	SaveContact(pAdBook);
}

✨2.3.3通讯录联系人信息修改

//修改联系人
void ModContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
	{
		printf("联系人列表为空,请新建联系人!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("请输入需要修改联系人的姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		printf("请输入新联系人的信息!\n");
		InputContact(pAdBook->ListMan + ret);
		printf("修改联系人成功!\n");
	}
	else
	{
		printf("查无此人!无法修改!\n");
	}
	SaveContact(pAdBook);
}

✨2.3.4通讯录联系人信息排序

//qsort的cmp函数
int cmp(const void* e1, const void* e2)
{
	return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序联系人
void SotrContact(AdBook* pAdBook)
{
	assert(pAdBook);

	qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
	printf("通讯录已经按姓名排序!\n");
	ShowContact(pAdBook);
	SaveContact(pAdBook);
}

🍸3.通讯录2.0文件版源代码

🍹3.1头文件

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once

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

#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30
#define INIT_CON 5
#define ADD_CON 5

typedef struct Contact
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tel[MAX_TEL];
	char address[MAX_ADDR];
	char email[MAX_EMAIL];
}Con;

typedef struct AddressBook
{
	struct Contact* ListMan;
	int number;
	int capacity;
}AdBook;

//加载通讯录
void LoadContact(AdBook* pAdBook);
//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook);
//销毁通讯录
void DestoryContact(AdBook* pAdBook);

//联系人信息打印
void PrintContact(AdBook* pAdBook, int index);
//联系人输入
void InputContact(Con* tmp);
//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name);

//联系人初始化
void InitContact(AdBook* pAdBook);
//增加联系人
void AddContact(AdBook* pAdBook);
//删除联系人
void DelContact(AdBook* pAdBook);
//修改联系人
void ModContact(AdBook* pAdBook);
//显示联系人
void ShowContact(AdBook* pAdBook);
//查找联系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函数
int cmp(const void* e1, const void* e2);
//排序联系人
void SotrContact(AdBook* pAdBook);
//保存通讯录
void SaveContact(AdBook* pAdBook);

🍹3.2功能实现文件

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

//加载通讯录
void LoadContact(AdBook* pAdBook)
{
	assert(pAdBook);
	FILE* pf = fopen("contact.txt", "rb");//open file
	if (pf == NULL)
	{
		perror("file open read");
		printf("数据加载失败!默认建立空通讯录!\n");
		return;
	}
	Con tmp = { 0 };
	while (fread(&tmp, sizeof(Con), 1, pf))
	{
		if (pAdBook->capacity == pAdBook->number)
		{
			IncreaseContact(pAdBook);
		}

		pAdBook->ListMan[pAdBook->number] = tmp;//scanf data
		pAdBook->number++;
	}
	fclose(pf);//close file
	pf = NULL;
}

//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook)
{
	assert(pAdBook);

	Con* p = (Con*)realloc(pAdBook->ListMan, sizeof(Con) * (pAdBook->capacity + ADD_CON));
	if (p == NULL)
	{
		printf("通讯录扩容失败!\n");
		exit(-1);
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->capacity += ADD_CON;
		p = NULL;
	}
}

//销毁通讯录
void DestoryContact(AdBook* pAdBook)
{
	assert(pAdBook);

	free(pAdBook->ListMan);
	pAdBook->ListMan = NULL;
	pAdBook->capacity = 0;
	pAdBook->number = 0;
}

//联系人信息打印
void PrintContact(AdBook* pAdBook, int index)
{
	assert(pAdBook);
	printf("            你的好友%10s   信息如下         \n", pAdBook->ListMan[index].name);
	int i = 0;
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "性别", pAdBook->ListMan[index].sex);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38d |\n", "年龄", pAdBook->ListMan[index].age);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "电话", pAdBook->ListMan[index].tel);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
	printf("--------------------------------------------------\n");
	printf("| %-5s | %-38s |\n", "邮箱", pAdBook->ListMan[index].email);
	printf("--------------------------------------------------\n");

}

//联系人输入
void InputContact(Con* tmp)
{
	printf("请输入联系人姓名:");
	scanf("%s", tmp->name);
	printf("请输入联系人性别:");
	scanf("%s", tmp->sex);
	printf("请输入联系人年龄:");
	scanf("%d", &(tmp->age));
	printf("请输入联系人电话:");
	scanf("%s", tmp->tel);
	printf("请输入联系人地址:");
	scanf("%s", tmp->address);
	printf("请输入联系人邮箱:");
	scanf("%s", tmp->email);
}

//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
		return -1;
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		if (strcmp(pAdBook->ListMan[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//联系人初始化
void InitContact(AdBook* pAdBook)
{
	assert(pAdBook);

	pAdBook->capacity = INIT_CON;
	Con* p = (Con*)malloc(sizeof(Con) * pAdBook->capacity);
	if (p == NULL)
	{
		printf("初始申请内存失败!\n");
		exit(-1);//程序没必要继续下去,直接终止
	}
	else
	{
		pAdBook->ListMan = p;
		pAdBook->number = 0;
		p = NULL;
	}
	printf("联系人加载中!\n");
	LoadContact(pAdBook);
	printf("联系人加载完成!\n");
}
//增加联系人
void AddContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->capacity == pAdBook->number)
	{
		IncreaseContact(pAdBook);
	}
	Con tmp = { 0 };
	InputContact(&tmp);
	pAdBook->ListMan[pAdBook->number] = tmp;
	pAdBook->number++;
	printf("新建联系人成功!\n");

	SaveContact(pAdBook);
}
//删除联系人
void DelContact(AdBook* pAdBook)
{
	assert(pAdBook);

	if (pAdBook->number == 0)
	{
		printf("联系人列表为空!\n");
	}
	else
	{
		char name[MAX_NAME] = { 0 };
		printf("请输入需要删除联系人的姓名->");
		scanf("%s", name);
		int ret = SearchName(pAdBook, name);
		if (ret >= 0)
		{
			int i = 0;
			for (i = ret; i < pAdBook->number - 1; i++)
			{
				pAdBook->ListMan[i] = pAdBook->ListMan[i + 1];
			}
			pAdBook->number--;
			printf("成功删除联系人:%s!\n", name);
		}
		else
		{
			printf("查无此人\n");
		}
	}

	SaveContact(pAdBook);
}
//修改联系人
void ModContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number <= 0)
	{
		printf("联系人列表为空,请新建联系人!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("请输入需要修改联系人的姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		printf("请输入新联系人的信息!\n");
		InputContact(pAdBook->ListMan + ret);
		printf("修改联系人成功!\n");
	}
	else
	{
		printf("查无此人!无法修改!\n");
	}
	SaveContact(pAdBook);
}
//显示联系人
void ShowContact(AdBook* pAdBook)
{
	assert(pAdBook);

	printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
	int i = 0;
	for (i = 0; i < pAdBook->number; i++)
	{
		printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex,
			pAdBook->ListMan[i].age,
			pAdBook->ListMan[i].tel,
			pAdBook->ListMan[i].address,
			pAdBook->ListMan[i].email);
	}
}
//查找联系人
void FindContact(AdBook* pAdBook)
{
	assert(pAdBook);
	if (pAdBook->number == 0)
	{
		printf("联系人列表为空,无法进行查找!\n");
		return;
	}
	char name[MAX_NAME] = { 0 };
	printf("请输入需要查找的联系人姓名->");
	scanf("%s", name);
	int ret = SearchName(pAdBook, name);
	if (ret >= 0)
	{
		PrintContact(pAdBook, ret);
	}
	else
	{
		printf("查无此人!\n");
	}
}
//qsort的cmp函数
int cmp(const void* e1, const void* e2)
{
	return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序联系人
void SotrContact(AdBook* pAdBook)
{
	assert(pAdBook);

	qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
	printf("通讯录已经按姓名排序!\n");
	ShowContact(pAdBook);
	SaveContact(pAdBook);
}
//保存通讯录
void SaveContact(AdBook* pAdBook)
{
	assert(pAdBook);

	FILE* pf = fopen("contact.txt", "wb");//二进制数据保存,用于计算机读取
	FILE* pf_read = fopen("通讯录.txt", "w+");//文本数据保存,用于用户阅读
	if (pf == NULL || pf_read == NULL)
	{
		perror("file write:");
		exit(-1);
	}
	int i = 0;
	fprintf(pf_read, "%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
	for (i = 0; i < pAdBook->number; i++)
	{
		fwrite(pAdBook->ListMan + i, sizeof(Con), 1, pf);//计算机数据
		fprintf(pf_read, "%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
			pAdBook->ListMan[i].name,
			pAdBook->ListMan[i].sex,
			pAdBook->ListMan[i].age,
			pAdBook->ListMan[i].tel,
			pAdBook->ListMan[i].address,
			pAdBook->ListMan[i].email);//用户数据
	}
	fclose(pf);
	fclose(pf_read);
	pf = NULL;
	pf_read = NULL;
}

🍹3.3菜单与测试文件

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void menu()
{
	printf("*******************************\n");
	printf("*****    通讯录2.0 文件版 *****\n");
	printf("*****    1 添加联系人     *****\n");
	printf("*****    2 删除联系人     *****\n");
	printf("*****    3 查找联系人     *****\n");
	printf("*****    4 修改联系人信息 *****\n");
	printf("*****    5 排序联系人信息 *****\n");
	printf("*****    6 显示联系人信息 *****\n");
	printf("*****    0 退出并保存     *****\n");
	printf("*******************************\n");
}

enum Founction
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	SHOW
};

struct AddressBook student;

int main()
{
	int input = 0;
	InitContact(&student);
	do
	{
		menu();
		printf("请输入菜单功能序号:");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&student);
			break;
		case DEL:
			DelContact(&student);
			break;
		case SEARCH:
			FindContact(&student);
			break;
		case MODIFY:
			ModContact(&student);
			break;
		case SORT:
			SotrContact(&student);
			break;
		case SHOW:
			ShowContact(&student);
			break;
		case EXIT:
			printf("退出通讯录成功!");
			SaveContact(&student);
			break;
		default:
			printf("输入字符非法!请重新输入!\n");
			break;
		}

	} while (input);
	return 0;
}

🌼4.总结

文件版的动态通讯录相比于传统的动态通讯录解决了文件数据存储与读取的问题,使文件的数据不丢失,极大的改善了用户体验!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。