C语言实现文件版(二进制文件版)通讯录

27 篇文章 0 订阅

通讯录功能

添加,删除,查找,修改, 全部,
储存



文件结构

头文件,函数文件,函数头文件。目录结构


提示:以下是本篇文章正文内容,下面案例可供参考

一、主函数文件(入口)

代码如下


#include "Contact.h"
void menu() {

	printf("1.Add        2.Del\n");
	printf("3.Search  4.Modeify\n");
	printf("5.Show     6.Sort\n");
	printf("       7.存储      \n");
	printf("      0.exit      \n ");
}


int main() {
	int input = 0;
	//创建通讯录

	//struct  Contact con;//包含1000个元素数组
	//使用柔性数组版本

	struct  Contact con;//包含data指针和size和capacity

	
	//初始化通讯录
	InitContact(&con);
	
	do
	{
		menu();
		printf("请选择:>");
		scanf("%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 SHOW:
	ShowContact(&con);
	break;
case SORT:
	break;
case Save:
	
	SaveContact(&con);
	break;
case 0:
	break;
	SaveContact(&con);
	//释放动态空间
	Destry(&con);
	printf("退出");
default:
	printf("选择错误");
	}
} while (input);


	return 0;
   
}

二、函数声明文件

#include<stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#define Max 1000
#define Namesize 20
#define Sexsize 5
#define TeleSize 5
#define AddrSize 12


#define Def 3


   //个人信息
 typedef struct PeoInfo{
char name[Namesize];
int age;
char sex[Sexsize];
char tele[TeleSize];
char addr[AddrSize];
}PeoInfo;


 //枚举选项
 enum option{
	 EXIT,//0
	 ADD,//1
	 DEL,//2
	 SEARCH,//3
	 MODIFY,//4
	 SHOW,
	 SORT,
	 Save
};


 //通讯录类型
typedef struct  Contact
 {
	 //struct PeoInfo data[Max];//存放1000个信息;->1000个 struct PeoInfo 这样的数据类型

	 //int size;记录已经有多少人信息
	 //使用柔性数组
	 struct PeoInfo* data;//存放1000个信息;->1000个 struct PeoInfo 这样的数据类型

	 int size;记录已经有多少人信息
	 int capacity;//记录当前通讯最大容量
	
 }Contact;
 //声明函数
 void  InitContact(struct  Contact* ps);
 void  AddContact(struct  Contact* ps);
 //删除
 void DelContact( struct  Contact* ps);
 void ShowContact(const struct  Contact* ps);

 void SearchContact(const struct  Contact* ps);
 void ModifyContact(struct Contact* ps);
 void Destry(struct Contact* ps);
 //保存
 void SaveContact(struct Contact* ps);
 //加载文件
 void Loding(struct Contact* ps);

三,函数的实现

#include "Contact.h"
//函数实现

//检查容量代码CheckCapacity
void  CheckCapacity(struct Contact* ps)
{
	if (ps->size==ps->capacity)
	{
		//增加空间
	struct PeoInfo*ptr=	realloc(ps->data, (ps->capacity + 2) * sizeof(struct PeoInfo));
	if (ptr != NULL)
	{
		ps->data = ptr;
		ps->capacity += 2;
		printf("增加空间成功");

	 }
	else
	{
		printf("增加失败");
	}
	}
 }

 
void  InitContact(struct  Contact* ps)
{
	//memset(ps->data, 0, sizeof(ps->data));
	//ps->size = 0;//设置通讯录初始化0个元素

	ps->data = (struct PeoInfo*)malloc(Def * sizeof(struct  PeoInfo));//开辟一个3*Peinfo这样的结构体类型
	if (ps->data==NULL)
	{
	//申请空间失败
		return;
	
	}
	ps->size = 0;
	ps->capacity = Def;

	 Loding(ps);//将文件添加到到数据里

	//

}

void CheckCapacity(struct Contact* ps);
void Loding(Contact* ps)
{
	PeoInfo tmp = { 0 };
	FILE* pfRead = fopen("contat.dat", "rb");
	if (pfRead == NULL){
		printf("LoadContact::%s\n", strerror(errno));
	return;
      }
//读取文件,存放到通讯录中
      while (fread(&tmp, sizeof(PeoInfo), 1, pfRead)) 
	{

		CheckCapacity(ps);
		ps->data[ps->size] = tmp;
		ps->size++;
		
	}
	fclose(pfRead);
	pfRead = NULL;

}



void  AddContact(struct  Contact* ps)
{
	//if (ps->size == Max)
	//{
	//	printf("通讯录已经满!");
	//}
	//else
	//{
	//	printf("请输入名字>>");
	//	scanf("%s", ps->data[ps->size].name);//ps->size下标
	//	printf("请输入年龄>>");
	//	scanf("%d", &(ps->data[ps->size].age));//age不是一个数组需要取地址操作
	//	printf("请输入性别>>");
	//	scanf("%s", ps->data[ps->size].sex);
	//	printf("请输入电话>>");
	//	scanf("%s", ps->data[ps->size].tele);
	//	printf("请输入地址>>");
	//	scanf("%s", ps->data[ps->size].addr);
	//	ps->size++;
	//	printf("添加成功\n");
	//}



	//检测当前通讯录的容量
	//如果满了,就增加空间


	CheckCapacity(ps);
	//增加数据
			printf("请输入名字>>");
		scanf("%s", ps->data[ps->size].name);//ps->size下标
		printf("请输入年龄>>");
		scanf("%d", &(ps->data[ps->size].age));//age不是一个数组需要取地址操作
		printf("请输入性别>>");
		scanf("%s", ps->data[ps->size].sex);
		printf("请输入电话>>");
		scanf("%s", ps->data[ps->size].tele);
		printf("请输入地址>>");
		scanf("%s", ps->data[ps->size].addr);
		ps->size++;
		printf("添加成功\n");

}


void ShowContact(const struct  Contact* ps)
{

	if (ps->size == 0)
	{
		printf("通讯录为空格\n");
	}
	else
	{
		int i = 0;
		//% -20s对齐
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		for (i = 0; i < ps->size; i++) {
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
				ps->data[i].name,
				ps->data[i].age,
				ps->data[i].sex,
				ps->data[i].tele,
				ps->data[i].addr);
		}



	}
}
// static(私有)
 static int  FindbyName(const struct Contact* ps, char name[Namesize])
{
	int i = 0;
	for (i = 0; i < ps->size; i++) {
		if (0 == strcmp(ps->data[i].name, name))
		{

			return i;
		}
	}
	return -1;

}

void DelContact( struct  Contact* ps)
{  
	char name[Namesize];
	int ret = 0;
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	//1.查找要删除的人在什么位置
	//找到了返回名字元素所在元素下标
	//找不到返回-1
    ret=FindbyName(ps,name);//查找名字函数
	//2.删除
	if (ret ==-1)
	{
		printf("要删除的人不存\n");
	}
	else
	{
		//删除数据
		int j = 0;
		for (j = ret; j < ps->size - 1; j++)
		{
			ps->data[j] = ps->data[j + 1];
		}
		ps->size--;
		printf("删除成功\n");
	}
}
void SearchContact(const struct  Contact* ps)
{
	int ret = 0;
	char name[Namesize];
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	 ret = FindbyName(ps, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
	}
	else
	{
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
				ps->data[ret].name,
				ps->data[ret].age,
				ps->data[ret].sex,
				ps->data[ret].tele,
				ps->data[ret].addr);
		

	}
}

void ModifyContact(struct Contact* ps)
{
	int ret = 0;
	char name[Namesize];
	printf("请输入要修改的名字:>");
	scanf("%s", name);
	 ret = FindbyName(ps, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
	}
	else
	{
		printf("开始修改操作>>");
		printf("请输入名字>>");
		scanf("%s", ps->data[ret].name);//ps->size下标
		printf("请输入年龄>>");
		scanf("%d", &(ps->data[ret].age));//age不是一个数组需要取地址操作
		printf("请输入性别>>");
		scanf("%s", ps->data[ret].sex);
		printf("请输入电话>>");
		scanf("%s", ps->data[ret].tele);
		printf("请输入地址>>");
		scanf("%s", ps->data[ret].addr);
		
		printf("修改成功\n");
	}
}

void Destry(struct Contact* ps)
{
	free(ps->data);
	ps->data = NULL;
}
void SaveContact(struct Contact* ps)
{
	FILE* pfWrite = fopen("contat.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(PeoInfo), 1, pfWrite);
	}
	fclose(pfWrite);
	pfWrite = NULL;

}

功能测试

添加

在这里插入图片描述

在这里插入图片描述

删除功能

在这里插入图片描述

查询功能

在这里插入图片描述

修改功能

在这里插入图片描述

存储功能

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值