通讯录进阶版(有动态扩容技术,文件操作技术)

基本的东西与前面的类似,只是加了一几个文件操作的函数

文件存档函数:

void save(AddressBook* addressBook) {
	 FILE* fp = fopen("d:/addressbook.txt","w");
	 if (fp == NULL) {
		 printf("文件打开失败!");
		 return;
	 }
	 fwrite(addressBook->persons, sizeof(personInfo), addressBook->size, fp);
	 printf("存档成功\n");
	 fclose(fp);
 }

文件读档函数 :

void load(AddressBook* addressBook) {
	 FILE* fp = fopen("d:/addressbook.txt", "r");
	 if (fp == NULL) {
		 printf("文件打开失败!\n");
		 return;
	 }
	 while (1) {
		 if (addressBook->size > addressBook->capacity) {
			 addressBook->capacity += 100;
			 addressBook->persons = (personInfo*)realloc(addressBook->persons,
				 sizeof(personInfo) * addressBook->capacity);
		 }
		 size_t n = fread(&addressBook->persons[addressBook->size], sizeof(personInfo), 1, fp);
		 if (n == 0) {
			 break;
		 }
		 addressBook->size++;
	 }
	 printf("读档成功!\n");
	 fclose(fp);
 }

 

以下是全部函数代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <Windows.h>

typedef struct PersonInfo {
	char name[1024];
	char sex[5];
	char age[100];
	char telphone[1024];
	char address[100];
}personInfo;

typedef struct AddressBook {
	personInfo* persons;
	int capacity;
	int size;
}AddressBook;

AddressBook addressBook;
extern void save(AddressBook* addressBook);

 void init(AddressBook* addressBook) {
	 addressBook -> size = 0;
	 addressBook->capacity = 100;
	 addressBook->persons = (personInfo*)malloc(addressBook->capacity*sizeof(personInfo));
	// memset(addressBook->persons, 0, sizeof(addressBook->persons));
}
 

 int 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("|          0.退出                      |\n");
	 printf("+--------------------------------------+\n");
	 printf("请输入你要进行的操作:");
	 int choice = 0;
	 (void)scanf("%d", &choice);
	 return choice;
 }
 void insert(AddressBook* addressBook) {

	 printf("新增联系人!\n");
	 assert(addressBook != NULL);

	 //数组的最大元素为1024,如果超过这个范围,就提示新增联系人失败.

	/* if (addressBook->size >= 1024) {
		 printf("新增联系人失败!");
		 return;
	 }*/
	 if (addressBook->size > addressBook->capacity) {
		 addressBook->capacity += 100;
		 addressBook->persons = (personInfo*)realloc(addressBook->persons,addressBook->capacity * sizeof(personInfo));
	}
	 personInfo person = { 0 };
	 printf("请输入新增联系人的姓名:");
	 scanf("%s", person.name);
	 printf("请输入新增联系人的性别:");
	 scanf("%s", person.sex);
	 printf("请输入新增联系人的年龄:");
	 scanf("%s", person.age);
	 printf("请输入新增联系人的电话:");
	 scanf("%s", person.telphone);
	 printf("请输入新增联系人的地址:");
	 scanf("%s", person.address);

	 //把 person 结构体放到 addressBookzhong!
	 //例如.当数组位空的时候,size就是0.此时新增的元素就放到下标位0的位置即可.
	 //插入完毕之后,就可以把size++ => 1
	 //下一次再插入的时候,此时size为1,就可以把新的元素放到size的位置.

	 addressBook->persons[addressBook->size] = person;
	 addressBook->size++;
	 printf("新增联系人成功!\n");
	 save(addressBook);
 }

 void drop(AddressBook* addressBook) {
	 printf("删除联系人!\n");

	 printf("请输入要删除的联系人序号:\n");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook-> size) {
		 printf("您的输入有误!删除失败!\n");
		 return;
	 }
	 if (id = addressBook->size - 1) {
		 addressBook->size--;
		 printf("删除成功!");
		 return;
	}
	 if (0 < id && id < addressBook->size) {
		 personInfo* lastperson = addressBook->size - 1;
		 addressBook->persons[id] = *lastperson;
		 addressBook->size--;
		 printf("删除成功!\n");
	 }
	 save(addressBook);
 }
 void search(AddressBook* addressBook) {
	 printf("查找指定联系人!");
	 printf("请输入你要查找的联系人的序号:");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook->size) {
		 printf("您的输入有误!查找失败!\n");
		 return;
	 }
	 personInfo* p = &addressBook->persons[id];
	 printf(" %s\t%s\t%s\t%s\t%s\n",p->name, p->sex, p->age, p->telphone, p->address);
	 printf("查找联系人成功\n");
 }
 void update(AddressBook* addressBook) {
	 printf("修改联系人!\n");
	 printf("请输入你要修改的联系人的序号:");
	 int id = 0;
	 scanf("%d", &id);
	 if (id < 0 || id > addressBook->size) {
		 printf("您的输入有误!修改失败!\n");
		 return;
	 }
	 personInfo* p = &addressBook->persons[id];
	 char name[1024] = { 0 };
	 char sex[5] = {0};
	 char age[100] = { 0 };
	 char telphone[1024] = { 0 };
	 char address[100] = { 0 };
	 printf("输入 * 表示该选项不修改!\n");
	 printf("请输入新的用户名字(旧的用户名字为 %s):", p->name);
	 scanf("%s", name);
	 if (strcmp(name,"*") != 0) {
		 strcpy(p->name, name);
	 }
	 printf("请输入新的用户性别(旧的用户性别为 %s):", p->sex);
	 scanf("%s", sex);
	 if (strcmp(sex, "*") != 0) {
		 strcpy(p->sex, sex);
	 }
	 printf("请输入新的用户年龄(旧的用户年龄为 %s):", p->age);
	 scanf("%s", age);
	 if (strcmp(age, "*") != 0) {
		 strcpy(p->age, age);
	 }
	 printf("请输入新的用户电话(旧的用户电话为 %s):", p->telphone);
	 scanf("%s", telphone);
	 if (strcmp(telphone, "*") != 0) {
		 strcpy(p->telphone,telphone);
	 }
	 printf("请输入新的用户地址(旧的用户地址为 %s):", p->address);
	 scanf("%s", address);
	 if (strcmp(address, "*") != 0) {
		 strcpy(p->address, address);
	 }
	 save(addressBook);
 }

 void show(AddressBook* addressBook) {
	 printf("查看联系人!\n");
	 //遍历数组
	 for (int i = 0; i < addressBook->size; i++) {
		 personInfo* p = &addressBook->persons[i];
		 printf("[%d] %s\t%s\t%s\t%s\t%s\n", i, p->name,p->sex,p->age,p->telphone,p->address);
	 }
	 printf("查看联系人完毕!一共有%d个联系人\n",addressBook->size);
 }

 void empty(AddressBook* addressBook) {
	 printf("清空所有联系人!\n");
	 for (int i = 0; i <= addressBook->size; i++) {
		 addressBook->size=0;
	 }
	 printf("已清空所有联系人\n");
	 save(addressBook);
 }
 void nameSort(AddressBook* addressBook) {
	 printf("按名字排序!\n");
	 int ret = 0;
	 for ( int i = 0; i < addressBook->size - 1; i++) {
		 for (int j = 0; j < addressBook->size - 1-i; j++) {
			 ret = strcmp(addressBook->persons[j].name, addressBook->persons[j + 1].name);
			 if (ret == 1) {
				 personInfo temp = addressBook->persons[j];
				 addressBook->persons[j] = addressBook->persons[j + 1];
				 addressBook->persons[j + 1] = temp;
			 }
		 }
	 }
	 for (int i = 0; i < addressBook->size; i++) {
		 printf("%s\n", addressBook->persons[i].name);
	 }
	 printf("排序成功!\n");
	 save(addressBook);
 }
 void save(AddressBook* addressBook) {
	 FILE* fp = fopen("d:/addressbook.txt","w");
	 if (fp == NULL) {
		 printf("文件打开失败!");
		 return;
	 }
	 fwrite(addressBook->persons, sizeof(personInfo), addressBook->size, fp);
	 printf("存档成功\n");
	 fclose(fp);
 }
 void load(AddressBook* addressBook) {
	 FILE* fp = fopen("d:/addressbook.txt", "r");
	 if (fp == NULL) {
		 printf("文件打开失败!\n");
		 return;
	 }
	 while (1) {
		 if (addressBook->size > addressBook->capacity) {
			 addressBook->capacity += 100;
			 addressBook->persons = (personInfo*)realloc(addressBook->persons,
				 sizeof(personInfo) * addressBook->capacity);
		 }
		 size_t n = fread(&addressBook->persons[addressBook->size], sizeof(personInfo), 1, fp);
		 if (n == 0) {
			 break;
		 }
		 addressBook->size++;
	 }
	 printf("读档成功!\n");
	 fclose(fp);
 }
 typedef void(*Func)(AddressBook*addressBook);
 
int main() {
	//1.进行初始化
	init(&addressBook);
	load(&addressBook);
	//2.与用户进行交互
	Func funcs[] = {
		NULL,//纯属为了占位
		insert,
		drop,
		update,
		search,
		show,
		empty,
		nameSort
	};
	while (1) {
		
		int choice = menu();
		if (choice < 0 || choice > sizeof(funcs) / sizeof(funcs[0])) {
			printf("您的输入有误!\n");
			continue;
		}
		if (choice == 0) {
			printf("GOODBYE!\n");
			break;
		}
		funcs[choice](&addressBook);
		system("pause");
		system("cls");
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值