文件读写操作+动态内存分配+结构体指针+函数指针数组实现通讯录系统

实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址


提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人

8.     保存现有文件到桌面的通讯录.txt文件

9.     从桌面的 通讯录.txt 读取信息并打印出来


头文件:contact.h


#pragma once  //只编译一次
#define _CRT_SECURE_NO_WARNINGS

#ifndef __CONTACT__
#define __CONTACT__
#define MAX_NAME 100 
#define MAX_SEX 20
#define MAX_TELEPHONE 20
#define MAX_ADDRESS 100
#define MAX_CAPACITY 1000 //最大容量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct People
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char telephone[MAX_TELEPHONE];
	char address[MAX_ADDRESS];
	int flag;
}People;

typedef struct Contact
{
	People * people;
	int count;
}Contact,*PContact;


void Add(PContact con);
void Delete(PContact con);
void Find(PContact con);
void Modify(PContact con);
void Show(PContact con);
void Empty(PContact con);
void Sort(PContact con);
void Save(PContact con);
void Free(PContact con);
void Show_file(PContact con);
void menu();



#endif // !__CONTACT__



主函数:main_contact.c


#include "contact.h"

int main()
{
	Contact contact = {0};
	int input = 1;
	void(*fun[9])(PContact) = {Add,Delete,Find,Modify,Show,Empty,Sort,Save,Show_file};

	while(1)
	{
		menu();
		printf("请选择功能======>");
		scanf("%d", &input);
		system("cls");
		if (input == 0)
		{
			Free(&contact);
			exit(0);
		}
		else if (input < 10 && input>0)
		{
			fun[input - 1](&contact);
		}
		else
			printf("输入有误!\n");
		
	}
	return 0;
}



函数实现代码:code_contact.h


#include "contact.h"

void menu()
{
	printf("******************************  通讯录  ******************************\n");
	printf("**********************************************************************\n");
	printf("**********************************************************************\n");
	printf("*****************           1.添加联系人信息                **********\n");
	printf("*****************           2.删除指定联系人信息            **********\n");
	printf("*****************           3.查找指定联系人信息            **********\n");
	printf("*****************           4.修改指定联系人信息            **********\n");
	printf("*****************           5.显示所有联系人信息            **********\n");
	printf("*****************           6.清空所有联系人                **********\n");
	printf("*****************           7.以名字排序所有联系人          **********\n");
	printf("*****************           8.保存所有信息到桌面            **********\n");
	printf("*****************           9.查看现有文件所存储的联系人    **********\n");
	printf("*****************           0.退出程序                      **********\n");
	printf("**********************************************************************\n");
	printf("**********************************************************************\n");
	printf("******************************  通讯录  ******************************\n");
}

void go_menu()
{
	printf("返回主菜单请输入y\n");
	fflush(stdin);
	while (1)
	{
		int c = 0;
		c = getchar();
		if (c == 'y')
			return;
	}
}

void Add(PContact con)
{
	int i = 0;
	int num = 0;

	printf("请输入要添加的人数======>\n");
	fflush(stdin);
	scanf("%d", &num);

	if ( num>MAX_CAPACITY || num < 0 )
	{
		printf("输入有误,人数范围限制在0-1000,请重新选择!\n");
	}

	if (con->count == 0)
	{
		People * Tmp = (People *)malloc(sizeof(People)*num);

		if (Tmp == NULL)
		{
			printf("out of memery");
			exit(EXIT_FAILURE);
		}
		else
		{
			con->people = Tmp;
		}
	}
	else
	{
		People * Tmp = (People *)realloc(con->people, sizeof(People)*(con->count+num));

		if(Tmp==NULL)
		{
			printf("out of memery");
			exit(EXIT_FAILURE);
		}
		else
		{
			con->people = Tmp;
		}

	}

	for (i = 0; i < num; i++)
	{
		printf("第%d个联系人\n", i + 1);
		printf("输入姓名==>>");
		fflush(stdin);
		scanf("%s", (con->people + con->count)->name);
		printf("输入性别==>>");
		fflush(stdin);
		scanf("%s", (con->people + con->count)->sex);
		printf("输入年龄==>>");
		fflush(stdin);
		scanf("%d", &(con->people + con->count)->age);
		printf("输入电话==>>");
		fflush(stdin);
		scanf("%s", (con->people + con->count)->telephone);
		printf("输入地址==>>");
		fflush(stdin);
		scanf("%s", (con->people + con->count)->address);
		(con->people + con->count)->flag = 1;
		con->count++;
		printf("\n");
	}
	go_menu();

}

void Show(PContact con)
{
	int i = 0;

	for (i = 0; i <con->count; i++)
	{
		if ((con->people + i)->flag == 1)
			printf("姓名:%s          性别:%s          \n年龄:%d          电话:%s          地址:%s          \n",
			(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
			(con->people + i)->telephone, (con->people + i)->address);
	}
	printf("以显示全部\n");
	go_menu();
	
}
void Find(PContact con)
{
	int i = 0;
	int t = 0;
	char search[100];

	printf("请输入要查找的名字:=======>");
	fflush(stdin);
	scanf("%s", search);

	for(i=0; i<con->count; i++)
	{
		if (strcmp((con->people + i)->name, search)==0)
		{
			printf("姓名:%s          性别:%s         \n年龄:%d           电话:%s           地址:%s          \n",
				(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
				(con->people + i)->telephone, (con->people + i)->address);
			t = 1;
		}
	}
	if (t == 0)
		printf("不存在此联系人!\n");
	else
		printf("已显示所有符合条件的联系人!\n");

	go_menu();

}
void Delete(PContact con)
{
	int i = 0;
	int t = 0;
	char search[100];
	printf("请输入要删除的名字:=======>");
	fflush(stdin);
	scanf("%s", search);
	for (i = 0; i<con->count; i++)
	{
		if (strcmp((con->people + i)->name, search)== 0)
		{
			(con->people + i)->flag = 0;
			t = 1;
		}
	}
	if (t == 0)
		printf("此联系人不存在,删除失败!\n");
	else
		printf("删除成功!\n");
	go_menu();


}
void Empty(PContact con)
{
	con->count = 0;
	printf("已清空所有联系人\n");
	go_menu();


}

void Modify(PContact con)
{

	char search[100];
	int i;
	printf("请输入要修改的名字:===>>>>>>>");
	fflush(stdin);
	scanf("%s", search);
	for (i = 0; i<con->count; i++)
	{
		if (strcmp(search,(con->people+i)->name) == 0)
		{
			printf("请输入要修改该联系人的信息:=======>>>>>>>>name/sex/age/phone/address/\n");
			fflush(stdin);
			scanf("%s", search);
			if (strcmp("name", search) == 0)
			{
				printf("请输入新信息:");
				fflush(stdin);
				scanf("%s", search);
				strcpy((con->people + i)->name, search);
			}
			if (strcmp("sex", search) == 0)
			{
				printf("请输入新信息:");
				fflush(stdin);
				scanf("%s", search);
				strcpy((con->people + i)->sex, search);
			}
			if (strcmp("age", search) == 0)
			{
				int b;
				printf("请输入新信息:");
				fflush(stdin);
				scanf("%d", &b);
				(con->people + i)->age = b;
			}
			if (strcmp("address", search) == 0)
			{
				printf("请输入新信息:");
				fflush(stdin);
				scanf("%s", search);
				strcpy((con->people + i)->address, search);
			}
			if (strcmp("phone", search) == 0)
			{
				printf("请输入新信息:");
				fflush(stdin);
				scanf("%s", search);
				strcpy((con->people + i)->telephone, search);
			}

		}
	}
	go_menu();


}

int cmp(const void *elem1, const void *elem2)
{
	return strcmp(((People*)elem1)->name, ((People*)elem2)->name);
}
void Sort(PContact con)
{
	int i = 0;

	qsort(con->people, con->count, sizeof(People), cmp);
	for (i = 0; i<con->count; i++)
	{
		if ((con->people + i)->name != '\0')
			printf("姓名:%s          性别:%s         \n年龄:%d           电话:%s           地址:%s          \n",
			(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
			(con->people + i)->telephone, (con->people + i)->address);

		printf("\n");
	}
	go_menu();


}

void Save(PContact con)
{
	int i = 0;
	FILE* file = fopen("C:\\Users\\Administrator\\Desktop\\通讯录.txt","w");
	
	if (file == NULL)
	{
		perror("C:\\Users\\Administrator\\Desktop\\通讯录.txt");
		exit(EXIT_FAILURE);
	}
	for (i = 0; i < con->count; i++)
	{
		if((con->people+i)->flag==1)
			fprintf(file,"姓名:%s          性别:%s          \n年龄:%d          电话:%s          地址:%s          \n",
			(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
				(con->people + i)->telephone, (con->people + i)->address);
	}
	if (fclose(file) != 0)
	{
		perror("fclose");
		exit(0);
	}
	printf("联系人信息已保存到桌面。\n");
	go_menu();


}

void Free(PContact con)
{
	free(con->people);
	con->people = NULL;

}

void Show_file(PContact con)
{
	FILE * file = fopen("C:\\Users\\Administrator\\Desktop\\通讯录.txt", "r");
	if (file == NULL)
	{
		perror("C:\\Users\\Administrator\\Desktop\\通讯录.txt");
		exit(EXIT_FAILURE);
	}
	while (!feof(file))//feof 如果到了文件的末尾就返回1  文件还没有结束就返回0
	{
		char c = fgetc(file);
		putchar(c);
	}
	printf("\n");
	if (fclose(file) != 0)
	{
		perror("fclose");
		exit(0);
	}
	go_menu();


}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值