完整版通讯录源代码(2)——最全的功能(二进制文件写入与读取)

// contact.h
#ifndef _CONTACT_H_
#define _CONTACT_H_

#pragma warning(disable:4996)
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>


//person 内部元素的大小
#define NAME_SIZE  32
#define ADDRESS_SIZE 128
#define SEX_SIZE 8
#define TELEPHONE_SIZE 32
#define SAVE_FILE "save.txt"

//通讯录的初始信息
#define INIT_NUM 2
#define INC_NUM  2


typedef struct person{
    
    

	char name[NAME_SIZE];
	char sex[SEX_SIZE];
	int age;
	char address[ADDRESS_SIZE];
	char telephone[TELEPHONE_SIZE];

}person_t;


typedef struct contact{
    
    

	int cap;   //容量
	int size;  //当前有效好友
	person_t frinds[0]; //柔性数组

}contact_t;


void InitContact(contact_t **ct);
void AddFriend(contact_t **ct);
void DelFriend(contact_t *ct);
void SearchFriend(contact_t *ct);
int SearchCore(contact_t *ct, const char *name);
void ModFriend(contact_t *ct);
void SortFrind(contact_t *ct);
void ClearFriend(contact_t *ct);
void SaveContact(contact_t *ct);
void SortFriend(contact_t *ct);
void ShowFriend(contact_t *ct);


#endif


//contact.c

#include "Contact.h"

void InitContact(contact_t **ct)
{
    
    

	FILE *fp = fopen(SAVE_FILE, "rb");
	if (fp == NULL)
	{
    
    
		*ct = (contact_t*)malloc(sizeof(contact_t)+sizeof(person_t)*INIT_NUM);
		if (*ct == NULL)
		{
    
    
			perror("malloc\n");
			exit(-1);
		}

		(*ct)->size = 0;
		(*ct)->cap = INIT_NUM;
		printf("Using Default Init!\n");

	}
	else{
    
    
		contact_t tmp;
		fread(&tmp, sizeof(contact_t), 1, fp);
		*ct = (contact_t*)malloc(sizeof(contact_t)+sizeof(person_t)*(tmp.cap));
		if (ct == NULL)
		{
    
    
			perror("malloc\n");
			exit(2);
		}
		memcpy(*ct, &tmp, sizeof(contact_t));
		fread((*ct)->frinds, sizeof(person_t), (*ct)->size, fp);
		printf("Using Save.txt Init!\n");
		fclose(fp);

	}
	
}

static int IsFull(contact_t *ct)
{
    
    
	return ct->size == ct->cap;

}

static int Inc(contact_t **ct)
{
    
    
	assert(ct);
	if ((*ct)->size == (*ct)->cap)
	{
    
    

		contact_t *tmp = (contact_t *)realloc(*ct,sizeof(person_t)*((*ct)->cap + INC_NUM) + sizeof(contact_t));
		if (tmp == NULL)
		{
    
    
			printf("malloc 失败!");
			exit(1);
		}

		*ct = tmp;
		(*ct)->cap += INC_NUM;
		printf("增容成功!\n");
		return 1;


	}
	return 0;

}

static int IsExist(contact_t *ct, person_t *p)
{
    
    

	assert(ct);
	assert(p);
	int i = 0;
	for (; i < ct->size; i++)
	{
    
    
		if (strcmp((ct->frinds + i)->name, p->name) == 0)
		{
    
    
			return 1;
		}
	}
	return 0;
}

void AddFriend(contact_t **ct)
{
    
    
	assert(ct);
	if (!IsFull(*ct) || Inc(ct))
	{
    
    
		person_t p;
		printf("请输入新增用户的姓名# ");
		scanf("%s", p.name);
		printf("请输入新增用户的性别# ");
		scanf("%s", p.sex);
		printf("请输入新增用户的年龄# ");
		scanf("%d", &p.age);
		printf("请输入新增用户的地址# ");
		scanf("%s", p.address);
		printf("请输入新增用户的电话# ");
		scanf("%s", p.telephone);

		if (IsExist(*ct, &p))
		{
    
    
			printf("%s 已经存在,请不要重复插入!", p.name);

		}
		else
		{
    
    
			memcpy((*ct)->frinds + (*ct)->size, &p, sizeof(p));
			(*ct)->size += 1;

			printf("新增用户成功!\n");
		}
		
	}

	else{
    
    

		printf("动态开辟内存失败!\n");
	}


}

int SearchCore(contact_t *ct, const char* name)
{
    
    
	assert(ct);
	assert(name);
	int i = 0;
	for (; i < ct->size; i++)
	{
    
    
		person_t *p = ct->frinds + i;
		if (strcmp(p->name, name)==0)
		{
    
    
			return i;
		}
	}
	return -1;
}


void SearchFriend(contact_t *ct)
{
    
    
	assert(ct);
	char name[NAME_SIZE];
	printf("请输入你要查找联系人的姓名:");
	scanf("%s", name);
	int i = SearchCore(ct, name);
	person_t *p = (ct->frinds + i);
	if (i >= 0)
	{
    
    
		printf("查找联系人成功!\n");
		printf("|%-10s|%-10s|%-10s|%-10s|%-10s|\n", "姓名", "性别", "年龄", "地址", "电话");
		printf("|%-10s|%-10s|%-10d|%-10s|%-10s|\n", p->name, p->sex, p->age, p->address, p->telephone);

	}
	else{
    
    
		printf("查找失败!\n");
	}
	
}

void ModFriend(contact_t *ct)
{
    
    
	assert(ct);
	char name[NAME_SIZE];
	printf("请输入你要修改联系人的姓名:");
	scanf("%s", name);
	int i = SearchCore(ct, name);
	if (i >= 0)
	{
    
    
		person_t p;
		printf("请输入修改后的姓名:");
		scanf("%s", p.name);
		printf("请输入修改后的性别:");
		scanf("%s", p.sex);
		printf("请输入修改后的年龄:");
		scanf("%d", &p.age);
		printf("请输入修改后的地址:");
		scanf("%s", p.address);
		printf("请输入修改后的电话:");
		scanf("%s", p.telephone);

		memcpy(ct->frinds + i, &p, sizeof(p));

		printf("修改联系人成功!\n");



	}
	else{
    
    
		printf("修改失败!\n");
	}

}

void DelFriend(contact_t *ct)
{
    
    
	assert(ct);


	char name[NAME_SIZE];
	printf("请输入你要删除的联系人:");
	scanf("%s", name);
	int i = SearchCore(ct, name);
	if (i >= 0)
	{
    
    
		ct->frinds[i] = ct->frinds[ct->size - 1];
		ct->size--;
		printf("删除联系人成功!\n");
	}

	else
	{
    
    
		printf("删除失败!\n");
	}

}

void ShowFriend(contact_t *ct)
{
    
    
	assert(ct);
	printf("\n|size: %6d|cap: %6d|\n\n", ct->size, ct->cap);
	printf("|%-10s|%-10s|%-10s|%-10s|%-10s|\n", "姓名", "性别", "年龄", "电话", "地址");
	int i = 0;
	for (; i < ct->size; i++)
	{
    
    
		person_t *p = ct->frinds + i;
		printf("|%-10s|%-10s|%-10d|%-10s|%-10s|\n", p->name, p->sex, p->age, p->telephone, p->address);
	}
	printf("\n\n");
}

static int cmpPerson(const void *p1, const void *p2)
{
    
    
	assert(p1);
	assert(p2);
	person_t *_p1 = (person_t *)p1;
	person_t *_p2 = (person_t *)p2;

	return strcmp(_p1->name, _p2->name);
}


void SortFriend(contact_t *ct)
{
    
    
	assert(ct);
	qsort(ct->frinds, ct->size, sizeof(person_t), cmpPerson);

	printf("联系人排序成功!\n");


}

void SaveContact(contact_t *ct)
{
    
    
	assert(ct);
	FILE *fp = fopen(SAVE_FILE, "wb");
	if (fp == NULL)
	{
    
    
		printf("save eror!\n");
		return;
	}

	fwrite(ct, sizeof(contact_t), 1, fp);
	fwrite(ct->frinds, sizeof(person_t),ct->size, fp);
	
	

	printf("保存文件成功!\n");
	fclose(fp);



}

void ClearFriend(contact_t *ct)
{
    
    
	assert(ct);
	ct->size = 0;

	printf("清除通讯录成功!\n");




}


//main.c
#include "Contact.h"


void ShowMenu()
{
    
    


	contact_t *ct = NULL;
	InitContact(&ct);
	int quit = 0;
	while (!quit)
	{
    
    
	printf("#######################################################\n");
	printf("#   1.Add       2. Del                   3.Search     #\n");
	printf("#   4. Mod      5. Show                  6.Clear      #\n");
	printf("#   7. Sort                              0.Exit       #\n");
	printf("#######################################################\n");
	printf("Please Select# ");
	int select = 0;
	scanf("%d", &select);

		switch (select)
		{
    
    
		case 1:
			AddFriend(&ct);
			break;
		case 2:
			DelFriend(ct);
			break;
		case 3:
			SearchFriend(ct);
			break;
		case 4:
			ModFriend(ct);
			break;
		case 5:
			ShowFriend(ct);
			break;
		case 6:
			ClearFriend(ct);
			break;
		case 7:
			SortFriend(ct);
			break;
		case 0:
			SaveContact(ct);
			quit = 1;
			break;
		default:
			break;
		}

	}
	
	free(ct);

}

int main()
{
    
    
	
	ShowMenu();



	return 0;
}

猜你喜欢

转载自blog.csdn.net/cfk17829572643/article/details/115143642