文件存储型 通讯录 实现 (C语言)

目录

功能都测试过  没有问题  各位课设的朋友 拿去吧  

我的vs是2019版的

主函数(源文件): zhu.c

#define _CRT_SECURE_NO_WARNINGS
#include"申明.h"



//通讯录使用前提   可以重名    但是手机号不能一样!!!   

void menu()
{

	printf("*************           通讯录             ******************\n");
	printf("*************************************************************\n");
	printf("*************************************************************\n");
	printf("************* 1增加联系人     2删除联系人  ******************\n");
	printf("************* 3查询联系人     4修改联系人  ******************\n");
	printf("************* 5排序联系人     6显示联系人  ******************\n");
	printf("*************         0退出系统            ******************\n");
	printf("*************************************************************\n");
	printf("*************************************************************\n");

	printf("\n");

}

 

int main()
{


	int floag = 0;
	man people;
	message* jet;
    jet = (message*)malloc(sizeof(message) * 2);   //先开辟两个大小
	
	if (jet == NULL)
	{
		printf("初始化失败\n");
		printf("%s\n", strerror(errno));
		return 0;
	}
	else
	{
		people.taxt = jet;	
		people.size = 0;
		people.capacity = 2;
	}
	readtext(&people);
	do 
	{
		menu();
		printf("请选择需要进行的操作>:");
		scanf("%d",&floag);

		switch (floag)
		{
		case 1:
			addtext(&people);
			break;
		case 2:
			deletetext(&people);
			break;
		case 3:
			findtext(&people);
			break;
		case 4:
			altertext(&people);
			break;
		case 5:
			sorttext(&people);
			break;
		case 6:
			showtext(&people);
			break;
		case 0:
			printf("已退出通讯录\n\n");
			break;

		default:

			printf("输入错误,请重新选择\n\n\n");
			Sleep(800);
			break;
		}


	} while (floag);

	storetext(&people);
	free(people.taxt);
   people.taxt = NULL;
	


	return 0;
}

函数库(源文件):function.c

#define _CRT_SECURE_NO_WARNINGS
#include"申明.h"


void addtext(man* people)
{

	if ((people->size) == (people->capacity))
	{
		message* jet = (message*)realloc(people->taxt, (people->capacity )* 2 * sizeof(message));
         
		if (jet == NULL)
		{
			printf("通讯录已满,扩容失败\n");
			printf("%s\n", strerror(errno));
			exit(-1);   //退出程序
		}
		else
		{
			printf("扩容成功\n");
			people->taxt = jet;
			people->capacity = people->capacity * 2;
			Sleep(300);
		}
	}

	printf("\n请输入联系人姓名:");
	scanf("%s", people->taxt[people->size].name);
	printf("\n请输入联系人性别:");
	scanf("%s", people->taxt[people->size].sxe);
    printf("\n请输入联系人电话:");
	scanf("%s", people->taxt[people->size].phone);
    printf("\n请输入联系人地址:");
	scanf("%s", people->taxt[people->size].address);
	printf("\n添加成功\n");
	Sleep(500);
	people->size = people->size + 1;

}





int look_up1 (man* x,char name[10])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].name, name))
		{
			floag = zu;  //保存下标

			if(aa==1)
		  printf("name           sex     phone               address\n");
          aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

    }
	if (y > 1)
	{
		printf("有多个联系人,请使用手机号进行删除\n");
		return -1;
	}
	else if (y== 0)
	{
		printf("未有该姓名的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}


int look_up2(man* x, char sex[5])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].sxe,sex))
		{
			floag = zu;  //保存下标

			if (aa == 1) 
				printf("name           sex     phone               address\n");
			aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

	}
	if (y > 1)
	{
		printf("\n有多个联系人,请使用其他属性查找进行删除\n");
		return -1;
	}
	else if (y == 0)
	{
		printf("未有该性别的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}


int look_up3(man* x, char phone[15])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].phone, phone))
		{
			floag = zu;  //保存下标

			if (aa == 1)
				printf("name           sex     phone               address\n");
			aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

	}
	 if (y == 0)
	{
		printf("未有该号码的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}


int look_up4(man* x, char address[10])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].address, address))
		{
			floag = zu;  //保存下标

			if (aa == 1)
				printf("name           sex     phone               address\n");
			aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

	}
	if (y > 1)
	{
		printf("\n有多个联系人,请使用其他属性查找进行删除\n");
		return -1;
	}
	else if (y == 0)
	{
		printf("未有该性别的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}




int find(man* x)
{
	do {
	stop2:;

		int floag = 0;
		printf("************      1姓名查找      2性别查找     **************\n");
		printf("************      3电话查找      4地址查找     **************\n");
		printf("*************************************************************\n");
		printf("************                0退出              **************\n");
		printf("\n请选择查找方式:\n");
		scanf("%d", &floag);
		switch (floag)
		{
		case 1:
			printf("请输查找人姓名:");
			char name[10];
			scanf("%s", name);
			int a = look_up1(x, name);
			if (a == -2)
				return 0;
			else if (a == -1)
				goto stop1;  //跳转到手机号查找

			else    //找到唯一一个  进行删除
			{
				for (; a <= x->size - 2; ++a)
				{
					x->taxt[a] = x->taxt[a + 1];   //往前覆盖
				}
				printf("\n删除成功\n");
				return 1;
			}
			break;


		case 2:
			printf("请输查找人的性别:");
			char sex[5];
			scanf("%s", sex);
			a = look_up2(x, sex);
			if (a == -2)
				return 0;
			else if (a == -1)
				goto stop2;  //跳转到查找目录

			else    //找到唯一一个  进行删除
			{
				for (; a <= x->size - 2; ++a)
				{
					x->taxt[a] = x->taxt[a + 1];   //往前覆盖
				}
				printf("\n删除成功\n");
				return 1;

			}
			break;


		case 3:
		stop1:
			printf("请输查找人电话:");
			char phone[15];
			scanf("%s", phone);
			a = look_up3(x, phone);
			if (a == -2)
				return 0;
			else    //找到唯一一个  进行删除
			{
				for (; a <= x->size - 2; ++a)
				{
					x->taxt[a] = x->taxt[a + 1];   //往前覆盖
				}
				printf("\n删除成功\n");
				return 1;

			}
			break;


		case 4:
			printf("请输查找人地址:");
			char address[10];
			scanf("%s", address);
			a = look_up4(x, address);
			if (a == -2)
				return 0;
			else if (a == -1)
				goto stop2;  //跳转到查找目录

			else    //找到唯一一个  进行删除
			{
				for (; a <= x->size - 2; ++a)
				{
					x->taxt[a] = x->taxt[a + 1];   //往前覆盖
				}
				printf("\n删除成功\n");
				return 1;

			}
			break;

		case 0:printf("退出成功\n");
			return 0;

		default:
			printf("\n输入错误,请重新输入:");
			break;

		}

	} while (1);


}




void deletetext(man* people)
{
	if ((people->size)<=0)
	{
		printf("联系人为空,无需删除了.\n");
			return;
	}

	int a=find(people);
	if (a == 1)
		people->size--;
	else
		printf("删除失败,请检查删除人信息;");

}





void look_up11(man* people, char* x)
{
	int zu = people->size;
	int floag = 1;
	while (zu--)
	{
		if (0 == strcmp(people->taxt[zu].name, x))
		{
			if (floag == 1) 
			{
				printf("\n查找成功,信息如下:\n\n");

				printf("name           sex     phone               address\n");
			}
			floag = 0;
			printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
		}

	}

	if (floag == 1)
		printf("\n查找失败,通讯录无此信息\n");

}


void look_up12(man* people, char* x)
{
	int zu = people->size;
	int floag = 1;
	while (zu--)
	{
		if (0 == strcmp(people->taxt[zu].sxe, x))
		{

			
			if (floag == 1)
			{
				printf("\n查找成功,信息如下:\n\n");
				printf("name           sex     phone               address\n");
			}
			floag = 0;
			printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
		}

	}

	if (floag == 1)
		printf("\n查找失败,通讯录无此信息\n");

}



void look_up13(man* people, char* x)
{
	int zu = people->size;
	int floag = 1;
	while (zu--)
	{
		if (0 == strcmp(people->taxt[zu].phone, x))
		{

			if (floag == 1)
			{
				printf("\n查找成功,信息如下:\n\n");
				printf("name           sex     phone               address\n");
			}
			floag = 0;
			printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
		}

	}

	if (floag == 1)
		printf("\n查找失败,通讯录无此信息\n");

}




void look_up14(man* people, char* x)
{
	int zu = people->size;
	int floag = 1;
	while (zu--)
	{
		if (0 == strcmp(people->taxt[zu].address, x))
		{

			if (floag == 1)
			{
				printf("\n查找成功,信息如下:\n\n");
				printf("name           sex     phone               address\n");
			}

			floag = 0;
			printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
		}

	}

	if (floag == 1)
		printf("\n查找失败,通讯录无此信息\n");

}


 
void findtext(man* people)
{
	if (people->size == 0)
	{
		printf("\n当前通讯录为空\n");
		Sleep(500);
		return;
	}

	do {
	stop2:;

		int floag = 0;
		printf("************      1姓名查找      2性别查找     **************\n");
		printf("************      3电话查找      4地址查找     **************\n");
		printf("*************************************************************\n");
		printf("************                0退出              **************\n");
		printf("\n请选择查找方式:\n");
		scanf("%d", &floag);
		switch (floag)
		{
		case 1:
			printf("请输查找人姓名:");
			char name[10];
			scanf("%s", name);
			look_up11(people, name);
			return;


			case 2:
				printf("请输查找人的性别:");
				char sex[5];
				scanf("%s", sex);
				look_up12(people, sex);
				return;


			case 3:
			stop1:
				printf("请输查找人电话:");
				char phone[15];
				scanf("%s", phone);
			look_up13(people, phone);
			return;


			case 4:
				printf("请输查找人地址:");
				char address[10];
				scanf("%s", address);
				look_up14(people, address);
				return;

			case 0:printf("退出成功\n");
				return;

			default:
				printf("\n输入错误,请重新输入:\n");
				break;

			}

		} while (1);

	
}










int look_up5(man* x, char name[10])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].name, name))
		{
			floag = zu;  //保存下标

			if (aa == 1)
				printf("name           sex     phone               address\n");
			aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

	}
	if (y > 1)
	{
		printf("有多个联系人,请使用手机号进行检索\n");
		return -1;
	}
	else if (y == 0)
	{
		printf("未有该姓名的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}


int look_up6(man* x, char sex[5])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].sxe, sex))
		{
			floag = zu;  //保存下标

			if (aa == 1)
				printf("name           sex     phone               address\n");
			aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

	}
	if (y > 1)
	{
		printf("\n有多个联系人,请使用其他属性查找进行检索\n");
		return -1;
	}
	else if (y == 0)
	{
		printf("未有该性别的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}


int look_up7(man* x, char phone[15])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].phone, phone))
		{
			floag = zu;  //保存下标

			if (aa == 1)
				printf("name           sex     phone               address\n");
			aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

	}
	if (y == 0)
	{
		printf("未有该号码的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}


int look_up8(man* x, char address[10])
{
	int zu = x->size;
	int y = 0;
	int floag = 0;
	int aa = 1;
	while (zu--)
	{
		if (0 == strcmp(x->taxt[zu].address, address))
		{
			floag = zu;  //保存下标

			if (aa == 1)
				printf("name           sex     phone               address\n");
			aa = 0;
			printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
			y++;
		}

	}
	if (y > 1)
	{
		printf("\n有多个联系人,请使用其他属性查找进行检索\n");
		return -1;
	}
	else if (y == 0)
	{
		printf("未有该性别的用户,查找失败\n");
		return -2;
	}
	else
	{
		printf("查找成功\n");
		return floag;

	}
}




void edit(man* x, int zu)
{
	int floag = 0;
	do {
		printf("************      1姓名修改      2性别修改     **************\n");
		printf("************      3电话修改      4地址修改     **************\n");
		printf("*************************************************************\n");
		printf("************                0退出              **************\n");
		printf("\n请选择类别:");
		scanf("%d", &floag);


		switch (floag)
		{
		case 1:
			printf("\n请输入修改后姓名:");
			char name[10];
			scanf("%s", name);
			memmove(x->taxt[zu].name, name, 10);
			printf("\n修改成功\n");

			break;


		case 2:
			printf("\n请输入修改后的性别:");
			char sex[5];
			scanf("%s", sex);
			memmove(x->taxt[zu].sxe, sex, 5);
			printf("\n修改成功\n");
			break;


		case 3: 
			printf("\n请输入修改后的电话:");
			char phone[15];
			scanf("%s", phone); 
			memmove(x->taxt[zu].phone,phone, 15);
			printf("\n修改成功\n");

			break;

		case 4: 
			printf("\n请输入修改后的地址:");
			char address[10];
			scanf("%s", address); 
			memmove(x->taxt[zu].address,address, 10);
			printf("\n修改成功\n");

			break;

		case 0: break;
		
		default:
			printf("\n输入错误,请重新选择\n");
			break;

		}

	} while (floag);


}

int find1(man* x)
{
	do {
	stop4:;

		int floag = 0;
		printf("************      1姓名查找      2性别查找     **************\n");
		printf("************      3电话查找      4地址查找     **************\n");
		printf("*************************************************************\n");
		printf("************                0退出              **************\n");
		printf("\n请选择查找方式:\n");
		scanf("%d", &floag);
		switch (floag)
		{
		case 1:
			printf("请输查找人姓名:");
			char name[10];
			scanf("%s", name);
			int a = look_up5(x, name);
			if (a == -2)
				return 0;
			else if (a == -1)
				goto stop3;  //跳转到手机号查找

			else    //找到唯一一个  进行修改
			{
				edit(x, a);
				return 1;
			}
			break;


		case 2:
			printf("请输查找人的性别:");
			char sex[5];
			scanf("%s", sex);
			a = look_up6(x, sex);
			if (a == -2)
				return 0;
			else if (a == -1)
				goto stop4;  //跳转到查找目录

			else    //找到唯一一个  进行修改
			{
				edit(x, a);
				return 1;
			}
			break;


		case 3:
		stop3:
			printf("请输查找人电话:");
			char phone[15];
			scanf("%s", phone);
			a = look_up7(x, phone);
			if (a == -2)
				return 0;
			else    //找到唯一一个  进行修改
			{
				edit(x, a);
				return 1;
			}
			break;


		case 4:
			printf("请输查找人地址:");
			char address[10];
			scanf("%s", address);
			a = look_up8(x, address);
			if (a == -2)
				return 0;
			else if (a == -1)
				goto stop4;  //跳转到查找目录

			else    //找到唯一一个  进行修改
			{
				edit(x, a);
				return 1;
			}
			break;

		case 0:printf("退出成功\n");
			return 0;

		default:
			printf("\n输入错误,请重新输入:");
			break;

		}

	} while (1);


}





void altertext(man* people)
{

	if ((people->size)<=0)
	{
		printf("联系人为空,无联系人可修改.\n");
		return;
	}

	int a = find1(people);
	if (a == 1)
		printf("\n\n联系人信息已修改\n");
	else
		printf("\n信息未修改\n");
}






int cmp1(const void* e1, const void* e2)
{
	return strcmp(((message*)e1)->name,((message*)e2)->name);
}

int cmp2(const void* e1, const void* e2)
{
	return strcmp(((message*)e1)->sxe, ((message*)e2)->sxe);

}

int cmp3(const void* e1, const void* e2)
{
	return strcmp(((message*)e1)->phone, ((message*)e2)->phone);

}

int cmp4(const void* e1, const void* e2)
{
	return strcmp(((message*)e1)->address, ((message*)e2)->address);

}



void sorttext(man* people)
{
	if (people->size <= 0)
	{
		printf("\n通讯录为空,无法排序\n");
		return;
	}
	int floag = 0;
	do {
		printf("************      1姓名排序      2性别排序     **************\n");
		printf("************      3电话排序      4地址排序     **************\n");
		printf("*************************************************************\n");
		printf("************                0退出              **************\n");
		printf("\n请选择排序方式:\n");
		scanf("%d", &floag);

		switch (floag)
		{

		case 1:
			qsort(people->taxt, people->size, sizeof(message), cmp1);
			printf("\n排序成功\n\n");
			return;
		case 2:
			qsort(people->taxt, people->size, sizeof(message), cmp2); 
			printf("\n排序成功\n\n");
			return;
		case 3:
			qsort(people->taxt, people->size, sizeof(message), cmp3);
			printf("\n排序成功\n\n");
			return;
		case 4:
			qsort(people->taxt, people->size, sizeof(message), cmp4);
			printf("\n排序成功\n\n");
			return;
		case 0: printf("\n退出成功\n\n");
			return;
		default :
			printf("\n输入有误,请重新选择\n");
			break;
		}

	} while (1);

}




void showtext(man* people)
{
	if (people->size <= 0)
	{
		printf("\n通讯录为空\n");
		return;
	}


	int i = 0;
	printf("name           sex     phone               address\n");

	for (i = 0; i <= ((people->size) - 1); ++i)
	{
		printf("%-15s%-8s%-20s%-10s\n", people->taxt[i].name, people ->taxt[i].sxe, people->taxt[i].phone, people->taxt[i].address);
	}
	printf("\n\n显示完成\n");
	return;

}







void storetext(man* people)
{
	FILE* jet;

	jet=fopen("store.txt", "w");
	if (jet == NULL)
	{
		perror("storetext");
		return;
	}

	int i = 0;
	int a = 0;
	for (i = 0; i <= people->size-1;++i)
	{
		fprintf(jet,"%s %s %s %s ", people->taxt[i].name, people->taxt[i].sxe, people->taxt[i].phone, people->taxt[i].address);
		
	}

	printf("\n保存成功,联系人已储存在文件中\n");
	Sleep(500);
	fclose(jet);
	jet = NULL;

}





void readtext(man* people)
{
	FILE* jet=fopen("store.txt", "r");
	if (jet == NULL)
	{
		perror("readtext");
		printf("\n");
	exit(-1);
	}


	
	while ((fscanf(jet,"%s %s %s %s ",people->taxt[people->size].name, people->taxt[people->size].sxe, people->taxt[people->size].phone, people->taxt[people->size].address))!=EOF)
	{
		people->size++;
		if (people->size == people->capacity)
		{
			message* a = (message*)realloc(people->taxt, sizeof(message) * 2 * people->capacity);
			if (a == NULL)
			{
				printf("\n扩容失败\n");
				exit(-1);
			}
			printf("\n扩容成功\n");
			people->taxt = a;
			people->capacity = people->capacity * 2;
		}
		
	}

	 
	printf("\n\n联系人写入完成\n\n");
	

	fclose(jet);
	jet= NULL;
}


头文件:申明.h

#pragma once
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>




typedef struct message
{
	char name[10];
	char sxe[5];
	char phone[15];
	char address[10];

}message;

typedef struct man
{
	message* taxt;
	int size;
	int capacity;


}man;



//增加联系人函数
void addtext(man* people);


//删除联系人
void deletetext(man* people);


//查找联系人
void findtext(man* people);


//修改联系人
void altertext(man* people);



//排序
void sorttext(man* people);


//显示联系人
void showtext(man* people);



//存储联系人到文件中
void storetext(man* people);



//初始化写入 文件中的联系人
void readtext(man* people);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值