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.Sort      ****\n");
	printf("*******  7.Save       0.Exit      ****\n");
	printf("**************************************\n");
}

int main()
{
	int input;
	//创建通讯录
	struct Contact con;//con就是通讯录
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();

		printf("Please select the operation you want to perform:");
		scanf_s("%d", &input);

		switch (input)
		{
		case Add:
			AddContact(&con);
			break;
		case Del:
			DelContact(&con);
			break;
		case Search:
			SearchContact(&con);
			break;
		case Modify:
			ModifyContact(&con);
			break;
		case Sort:
			SortContact(&con);
			break;
		case Save:
			SaveContact(&con);
			break;
		case Show:
			ShowContact(&con);
			break;
		case Exit:
			SaveContact(&con);
			//销毁通讯录--释放动态开辟的内存
			DestroyContact(&con);
			printf("退出通讯录.\n");
			break;
		default:
			printf("选择错误.\n");
			break;
		}
	} while (input);

	return 0;
}

头文件(函数的声明,宏定义等等)

#pragma once

#define MAX_NAME 20
#define MAX_SEX  5
#define MAX_TELE 15
#define MAX_ADDR 30
#define DEFAULT_SIZE 3

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

enum option
{
	Exit,
	Add,
	Del,
	Search,
	Modify,
	Show,
	Sort,
	Save
};


struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
};


//通讯录类型
struct Contact
{
	struct PeoInfo* data;//data指向一块空间
	int size;//记录当前已有的元素个数
	int capacity;//当前通讯录的最大容量
};


//函数声明
//初始化通讯录
void InitContact(struct Contact* ps);

//添加一个信息到通讯录
void AddContact(struct Contact* ps);

//从通讯录中删除一个信息
void DelContact(struct Contact* ps);

//查询通讯录
void SearchContact(struct Contact* ps);

//修改信息
void ModifyContact(struct Contact* ps);

//对通讯录按名字排序
void SortContact(struct Contact* ps);

//将通讯录信息保存到文件中
void SaveContact(struct Contact* ps);

//展示通讯录
void ShowContact(struct Contact* ps);

//释放动态开辟的内存
void DestroyContact(struct Contact* ps);

//将文件中已有的信息加载到通讯录中
void LoadContact(struct Contact* ps);

各函数实现

#define _CRT_SECURE_NO_WARNINGS

#include"contact.h"

void InitContact(struct Contact* ps)
{
	ps->data = (struct PeoInfo*)malloc(DEFAULT_SIZE * sizeof(struct PeoInfo));
	if (ps->data == NULL)
	{
		return;
	}
	ps->size = 0;
	ps->capacity = DEFAULT_SIZE;

	//把文件中已经存放的通讯录中的信息加载到通讯录中
	LoadContact(ps);
}

void LoadContact(struct Contact* ps)
{
	struct PeoInfo tmp = { 0 };
	FILE* pfRead = fopen("contact.dat", "rb");

	if (pfRead == NULL)
	{
		printf("LoadContact::%s.\n", strerror(errno));
		return;
	}

	//读取文件,存放到通讯录中

	void CheckCapacity(struct Contact* ps);

	//fread函数返回值为读到的元素个数(size_t fread)
	//在该程序中调用fread函数,如果返回值小于1(0),即表示全部读完

	while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead))
	{
		CheckCapacity(ps);
		ps->data[ps->size] = tmp;
		ps->size++;
	}

	fclose(pfRead);
	pfRead = NULL;

}

void CheckCapacity(struct Contact* ps)
{
	if (ps->size == ps->capacity)
	{
		struct Contact* ptr = (struct Contact*)realloc(ps->data, (ps->capacity + 2) * sizeof(struct PeoInfo));
		if (ptr != NULL)
		{
			ps->data = ptr;
			ps->capacity += 2;
			printf("增容成功.\n");
		}
		else
		{
			printf("增容失败.\n");
		}
	}
}

void AddContact(struct Contact* ps)
{
	//检测当前通讯录的容量
	/*满了就增加空间
		没满就增加数据*/
	CheckCapacity(ps);

	printf("请输入名字:");
	scanf_s("%s", ps->data[ps->size].name, MAX_NAME);
	printf("请输入年龄:");
	scanf_s("%d", &(ps->data[ps->size].age));
	printf("请输入性别:");
	scanf_s("%s", ps->data[ps->size].sex, MAX_SEX);
	printf("请输入电话号码:");
	scanf_s("%s", ps->data[ps->size].tele, MAX_TELE);
	printf("请输入地址:");
	scanf_s("%s", ps->data[ps->size].addr, MAX_ADDR);

	ps->size++;

	printf("录入成功.\n");
}


void ShowContact(struct Contact* ps)
{
	if (ps->size == 0)
	{
		printf("通讯录为空.\n");
	}
	else
	{
		int i = 0;
		printf("%-10s\t%-4s\t%-4s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "住址");

		for (i = 0; i < ps->size; i++)
		{
			printf("%-10s\t%-4d\t%-4s\t%-15s\t%-20s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].tele,
				ps->data[i].addr);
		}
	}
}


int FindName(const struct Contact* ps, char name[MAX_NAME])
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(ps->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(struct Contact* ps)
{
	char name[MAX_NAME] = "0";
	printf("请输入你想删除的人的姓名:");
	scanf_s("%s", name, MAX_NAME);

	//查找要删除人在什么位置
	/*找到了返回名字所在元素的下标
	没找到返回-1*/
	int pos = FindName(ps, name);

	if (pos != -1)
	{
		for (int i = pos; i < ps->size - 1; i++)
		{
			ps->data[i] = ps->data[i + 1];
		}
		ps->size--;
		printf("删除成功.\n");
	}
	else
	{
		printf("该信息不存在.\n");
	}
}



void SearchContact(struct Contact* ps)
{
	char name[MAX_NAME] = "0";
	printf("请输入要查找的联系人的姓名:");
	scanf_s("%s", name, MAX_NAME);
	/*找到了返回名字所在元素的下标
	没找到返回-1*/
	int pos = FindName(ps, name);

	if (pos == -1)
	{
		printf("要查找的人不存在.\n");
	}
	else
	{
		printf("%-10s\t%-4s\t%-4s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "住址");
		printf("%-10s\t%-4d\t%-4s\t%-15s\t%-20s\n",
			ps->data[pos].name,
			ps->data[pos].age,
			ps->data[pos].sex,
			ps->data[pos].tele,
			ps->data[pos].addr);
	}
}

void ModifyContact(struct Contact* ps)
{
	char name[MAX_NAME];
	printf("请输入你想要修改的联系人的名字:");
	scanf_s("%s", name, MAX_NAME);

	//找到了就返回名字所在元素的下标,没找到就返回-1

	int pos = FindName(ps, name);

	if (pos = -1)
	{
		printf("该联系人不存在.\n");
	}
	else
	{
		printf("请输入名字:");
		scanf_s("%s", ps->data[pos].name, MAX_NAME);
		printf("请输入年龄:");
		scanf_s("%d", &(ps->data[pos].age));
		printf("请输入性别:");
		scanf_s("%s", ps->data[pos].sex, MAX_SEX);
		printf("请输入电话号码:");
		scanf_s("%s", ps->data[pos].tele, MAX_TELE);
		printf("请输入地址:");
		scanf_s("%s", ps->data[pos].addr, MAX_ADDR);

		printf("修改完成.\n");
	}
}


//以名字方式对通讯录信息排序

int cmp_stu_by_name(const void* element1, const void* element2)
{
	return strcmp(((struct PeoInfo*)element1)->name, ((struct PeoInfo*)element2)->name);
}

void SortContact(struct Contact* ps)
{
	qsort(ps->data, ps->size, sizeof(struct PeoInfo), cmp_stu_by_name);
}


//保存
void SaveContact(struct Contact* ps)
{
	FILE* pfWrite = fopen("contact.dat", "wb");
	if (pfWrite == NULL)
	{
		printf("SaveContact::%s\n", strerror(errno));
		return;
	}

	//将通讯录信息写入文件
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		fwrite(&(ps->data[i]), sizeof(struct PeoInfo), 1, pfWrite);
	}

	fclose(pfWrite);
	pfWrite = NULL;

}


//释放动态开辟的内存
void DestroyContact(struct Contact* ps)
{
	free(ps->data);
	ps->data = NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值