基本的东西与前面的类似,只是加了一几个文件操作的函数
文件存档函数:
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;
}