通讯录2.0版本来了文件版——C语言实现简单通讯录文件版(基于顺序表)
⭐️前面的话⭐️
大家好!上次博主介绍了动态与静态版的通讯录,虽然动态版通讯录能够无限地读取联系人,但是程序结束后数据都没有了,这样的通讯录用起来真的是超级难受,所以通讯录2.0出来了,能够将数据自动存入文件中,并且程序关闭再打开会自动读取保存上次的联系人信息。这篇文章将在动态通讯录的基础上魔改,进化成能够自动保存的通讯录。
🍸1.文件版通讯录
🍹1.1设计目的
前面介绍了静态版与动态版的通讯录,但是这些版本通讯录并不能对数据进行存储与读取,解决方法是使用文件的读写来进行数据的读取与储存。
- [ ] 能储存联系人的一些基本信息,例如:姓名,性别,年龄,电话,地址,邮箱等。
- [ ] 能够对通讯录进行添加,删除,修改,查找,排序,查看联系人。
- [ ] 拥有一个简洁的联系人信息查看页面。
- [ ] 弥补静态通讯录在空间上的不足,能够根据联系人数量动态调整通讯录大小。
- [ ] 能够读取与储存数据,做到关闭程序数据依然存在。
- [ ] 使用方便,简单。
🍹1.2菜单设计
这块不多介绍,运用输出函数显示一个菜单。
*******************************
***** 通讯录2.0 文件版 *****
***** 1 添加联系人 *****
***** 2 删除联系人 *****
***** 3 查找联系人 *****
***** 4 修改联系人信息 *****
***** 5 排序联系人信息 *****
***** 6 显示联系人信息 *****
***** 0 退出并保存 *****
*******************************
请输入菜单功能序号:
void menu()
{
printf("*******************************\n");
printf("***** 通讯录2.0 文件版 *****\n");
printf("***** 1 添加联系人 *****\n");
printf("***** 2 删除联系人 *****\n");
printf("***** 3 查找联系人 *****\n");
printf("***** 4 修改联系人信息 *****\n");
printf("***** 5 排序联系人信息 *****\n");
printf("***** 6 显示联系人信息 *****\n");
printf("***** 0 退出并保存 *****\n");
printf("*******************************\n");
}
enum Founction
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
SHOW
};
struct AddressBook student;
int main()
{
int input = 0;
InitContact(&student);
do
{
menu();
printf("请输入菜单功能序号:");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&student);
break;
case DEL:
DelContact(&student);
break;
case SEARCH:
FindContact(&student);
break;
case MODIFY:
ModContact(&student);
break;
case SORT:
SotrContact(&student);
break;
case SHOW:
ShowContact(&student);
break;
case EXIT:
printf("退出通讯录成功!");
SaveContact(&student);
break;
default:
printf("输入字符非法!请重新输入!\n");
break;
}
} while (input);
return 0;
}
🍹1.3联系人信息设计
这个模块与前面动态通讯录一致。
✨1.3.1联系人信息结构
typedef struct Contact
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tel[MAX_TEL];
char address[MAX_ADDR];
char email[MAX_EMAIL];
}Con;
typedef struct AddressBook
{
struct Contact* ListMan;
int number;
int capacity;
}AdBook;
✨1.3.2宏与文件包含信息
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30
#define INIT_CON 5
#define ADD_CON 5
🍹1.4各功能函数声明
//加载通讯录
void LoadContact(AdBook* pAdBook);
//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook);
//销毁通讯录
void DestoryContact(AdBook* pAdBook);
//联系人信息打印
void PrintContact(AdBook* pAdBook, int index);
//联系人输入
void InputContact(Con* tmp);
//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name);
//联系人初始化
void InitContact(AdBook* pAdBook);
//增加联系人
void AddContact(AdBook* pAdBook);
//删除联系人
void DelContact(AdBook* pAdBook);
//修改联系人
void ModContact(AdBook* pAdBook);
//显示联系人
void ShowContact(AdBook* pAdBook);
//查找联系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函数
int cmp(const void* e1, const void* e2);
//排序联系人
void SotrContact(AdBook* pAdBook);
//保存通讯录
void SaveContact(AdBook* pAdBook);
🍹1.5通讯录2.0的变化
最大的变化就是能够把数据导出成文本,并且能够读取上一次保留的数据。
🍸2.文件版通讯录基础功能从理论到实践
🍹2.1联系人的查找,显示与销毁
这一部分与上一代动态通讯录是一模一样,没有一点点改变,所以不详细说明。
✨2.1.1联系人显示
//显示联系人
void ShowContact(AdBook* pAdBook)
{
assert(pAdBook);
printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
int i = 0;
for (i = 0; i < pAdBook->number; i++)
{
printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
pAdBook->ListMan[i].name,
pAdBook->ListMan[i].sex,
pAdBook->ListMan[i].age,
pAdBook->ListMan[i].tel,
pAdBook->ListMan[i].address,
pAdBook->ListMan[i].email);
}
}
✨2.1.2联系人查找
//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name)
{
assert(pAdBook);
if (pAdBook->number <= 0)
return -1;
int i = 0;
for (i = 0; i < pAdBook->number; i++)
{
if (strcmp(pAdBook->ListMan[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//联系人信息打印
void PrintContact(AdBook* pAdBook, int index)
{
assert(pAdBook);
printf(" 你的好友%10s 信息如下 \n", pAdBook->ListMan[index].name);
int i = 0;
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "性别", pAdBook->ListMan[index].sex);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38d |\n", "年龄", pAdBook->ListMan[index].age);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "电话", pAdBook->ListMan[index].tel);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "邮箱", pAdBook->ListMan[index].email);
printf("--------------------------------------------------\n");
}
//查找联系人
void FindContact(AdBook* pAdBook)
{
assert(pAdBook);
if (pAdBook->number == 0)
{
printf("联系人列表为空,无法进行查找!\n");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入需要查找的联系人姓名->");
scanf("%s", name);
int ret = SearchName(pAdBook, name);
if (ret >= 0)
{
PrintContact(pAdBook, ret);
}
else
{
printf("查无此人!\n");
}
}
✨2.1.3通讯录销毁
//销毁通讯录
void DestoryContact(AdBook* pAdBook)
{
assert(pAdBook);
free(pAdBook->ListMan);
pAdBook->ListMan = NULL;
pAdBook->capacity = 0;
pAdBook->number = 0;
}
🍹2.2联系人数据加载与保存
由于我们的数据是保存在文件中的,那当然少不了对数据进行加载与保存。
✨2.2.1通讯录数据加载
数据是以二进制形式储存在文件中的,要对数据进行加载,那肯定需要打开文件并读取文件具体内容。
整个加载过程可以分成三步:
- 打开文件
- 对文件数据进行读取
- 关闭文件
//加载通讯录
void LoadContact(AdBook* pAdBook)
{
assert(pAdBook);
FILE* pf = fopen("contact.txt", "rb");//open file
if (pf == NULL)
{
perror("file open read");
printf("数据加载失败!默认建立空通讯录!\n");
return;
}
Con tmp = { 0 };
while (fread(&tmp, sizeof(Con), 1, pf))
{
if (pAdBook->capacity == pAdBook->number)
{
IncreaseContact(pAdBook);
}
pAdBook->ListMan[pAdBook->number] = tmp;//scanf data
pAdBook->number++;
}
fclose(pf);//close file
pf = NULL;
}
✨2.2.2通讯录数据保存
数据的保存实质上就是数据写入文件,这里我们分两种情况对文件进行写入:
- 二进制数据写入,用于计算机加载通讯录
- 文本数据写入,用于用户提取通讯录联系人
//保存通讯录
void SaveContact(AdBook* pAdBook)
{
assert(pAdBook);
FILE* pf = fopen("contact.txt", "wb");//二进制数据保存,用于计算机读取
FILE* pf_read = fopen("通讯录.txt", "w+");//文本数据保存,用于用户阅读
if (pf == NULL || pf_read == NULL)
{
perror("file write:");
exit(-1);
}
int i = 0;
fprintf(pf_read, "%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
for (i = 0; i < pAdBook->number; i++)
{
fwrite(pAdBook->ListMan + i, sizeof(Con), 1, pf);//计算机数据
fprintf(pf_read, "%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
pAdBook->ListMan[i].name,
pAdBook->ListMan[i].sex,
pAdBook->ListMan[i].age,
pAdBook->ListMan[i].tel,
pAdBook->ListMan[i].address,
pAdBook->ListMan[i].email);//用户数据
}
fclose(pf);
fclose(pf_read);
pf = NULL;
pf_read = NULL;
}
🍹2.3联系人初始化,新建,修改与排序
对于联系人的初始化,在动态版通讯录基础上需要对二进制文件数据进行加载,所以初始化过程最后还需要加载数据。而新建联系人,修改联系人,排序联系人。都对数据进行了变动,因此最后需要对改动后的数据进行保存,其他过程实现都没有变动。注意!初始化中的加载与新建联系人都有可能遇到通讯录满的问题,所以加载和新建联系人之前需要判断通讯录是否满,如果满了需要增容。
✨2.3.1通讯录数据初始化与加载
//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook)
{
assert(pAdBook);
Con* p = (Con*)realloc(pAdBook->ListMan, sizeof(Con) * (pAdBook->capacity + ADD_CON));
if (p == NULL)
{
printf("通讯录扩容失败!\n");
exit(-1);
}
else
{
pAdBook->ListMan = p;
pAdBook->capacity += ADD_CON;
p = NULL;
}
}
//联系人初始化
void InitContact(AdBook* pAdBook)
{
assert(pAdBook);
pAdBook->capacity = INIT_CON;
Con* p = (Con*)malloc(sizeof(Con) * pAdBook->capacity);
if (p == NULL)
{
printf("初始申请内存失败!\n");
exit(-1);//程序没必要继续下去,直接终止
}
else
{
pAdBook->ListMan = p;
pAdBook->number = 0;
p = NULL;
}
printf("联系人加载中!\n");
LoadContact(pAdBook);
printf("联系人加载完成!\n");
}
✨2.3.2通讯录新建联系人
//增加联系人
void AddContact(AdBook* pAdBook)
{
assert(pAdBook);
if (pAdBook->capacity == pAdBook->number)
{
IncreaseContact(pAdBook);
}
Con tmp = { 0 };
InputContact(&tmp);
pAdBook->ListMan[pAdBook->number] = tmp;
pAdBook->number++;
printf("新建联系人成功!\n");
SaveContact(pAdBook);
}
✨2.3.3通讯录联系人信息修改
//修改联系人
void ModContact(AdBook* pAdBook)
{
assert(pAdBook);
if (pAdBook->number <= 0)
{
printf("联系人列表为空,请新建联系人!\n");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入需要修改联系人的姓名->");
scanf("%s", name);
int ret = SearchName(pAdBook, name);
if (ret >= 0)
{
printf("请输入新联系人的信息!\n");
InputContact(pAdBook->ListMan + ret);
printf("修改联系人成功!\n");
}
else
{
printf("查无此人!无法修改!\n");
}
SaveContact(pAdBook);
}
✨2.3.4通讯录联系人信息排序
//qsort的cmp函数
int cmp(const void* e1, const void* e2)
{
return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序联系人
void SotrContact(AdBook* pAdBook)
{
assert(pAdBook);
qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
printf("通讯录已经按姓名排序!\n");
ShowContact(pAdBook);
SaveContact(pAdBook);
}
🍸3.通讯录2.0文件版源代码
🍹3.1头文件
contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define MAX_NAME 20
#define MAX_SEX 8
#define MAX_TEL 18
#define MAX_ADDR 30
#define MAX_EMAIL 30
#define INIT_CON 5
#define ADD_CON 5
typedef struct Contact
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tel[MAX_TEL];
char address[MAX_ADDR];
char email[MAX_EMAIL];
}Con;
typedef struct AddressBook
{
struct Contact* ListMan;
int number;
int capacity;
}AdBook;
//加载通讯录
void LoadContact(AdBook* pAdBook);
//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook);
//销毁通讯录
void DestoryContact(AdBook* pAdBook);
//联系人信息打印
void PrintContact(AdBook* pAdBook, int index);
//联系人输入
void InputContact(Con* tmp);
//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name);
//联系人初始化
void InitContact(AdBook* pAdBook);
//增加联系人
void AddContact(AdBook* pAdBook);
//删除联系人
void DelContact(AdBook* pAdBook);
//修改联系人
void ModContact(AdBook* pAdBook);
//显示联系人
void ShowContact(AdBook* pAdBook);
//查找联系人
void FindContact(AdBook* pAdBook);
//qsort的cmp函数
int cmp(const void* e1, const void* e2);
//排序联系人
void SotrContact(AdBook* pAdBook);
//保存通讯录
void SaveContact(AdBook* pAdBook);
🍹3.2功能实现文件
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//加载通讯录
void LoadContact(AdBook* pAdBook)
{
assert(pAdBook);
FILE* pf = fopen("contact.txt", "rb");//open file
if (pf == NULL)
{
perror("file open read");
printf("数据加载失败!默认建立空通讯录!\n");
return;
}
Con tmp = { 0 };
while (fread(&tmp, sizeof(Con), 1, pf))
{
if (pAdBook->capacity == pAdBook->number)
{
IncreaseContact(pAdBook);
}
pAdBook->ListMan[pAdBook->number] = tmp;//scanf data
pAdBook->number++;
}
fclose(pf);//close file
pf = NULL;
}
//对通讯录进行增容
void IncreaseContact(AdBook* pAdBook)
{
assert(pAdBook);
Con* p = (Con*)realloc(pAdBook->ListMan, sizeof(Con) * (pAdBook->capacity + ADD_CON));
if (p == NULL)
{
printf("通讯录扩容失败!\n");
exit(-1);
}
else
{
pAdBook->ListMan = p;
pAdBook->capacity += ADD_CON;
p = NULL;
}
}
//销毁通讯录
void DestoryContact(AdBook* pAdBook)
{
assert(pAdBook);
free(pAdBook->ListMan);
pAdBook->ListMan = NULL;
pAdBook->capacity = 0;
pAdBook->number = 0;
}
//联系人信息打印
void PrintContact(AdBook* pAdBook, int index)
{
assert(pAdBook);
printf(" 你的好友%10s 信息如下 \n", pAdBook->ListMan[index].name);
int i = 0;
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "姓名", pAdBook->ListMan[index].name);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "性别", pAdBook->ListMan[index].sex);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38d |\n", "年龄", pAdBook->ListMan[index].age);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "电话", pAdBook->ListMan[index].tel);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "地址", pAdBook->ListMan[index].address);
printf("--------------------------------------------------\n");
printf("| %-5s | %-38s |\n", "邮箱", pAdBook->ListMan[index].email);
printf("--------------------------------------------------\n");
}
//联系人输入
void InputContact(Con* tmp)
{
printf("请输入联系人姓名:");
scanf("%s", tmp->name);
printf("请输入联系人性别:");
scanf("%s", tmp->sex);
printf("请输入联系人年龄:");
scanf("%d", &(tmp->age));
printf("请输入联系人电话:");
scanf("%s", tmp->tel);
printf("请输入联系人地址:");
scanf("%s", tmp->address);
printf("请输入联系人邮箱:");
scanf("%s", tmp->email);
}
//以姓名搜索联系人
int SearchName(AdBook* pAdBook, const char* name)
{
assert(pAdBook);
if (pAdBook->number <= 0)
return -1;
int i = 0;
for (i = 0; i < pAdBook->number; i++)
{
if (strcmp(pAdBook->ListMan[i].name, name) == 0)
{
return i;
}
}
return -1;
}
//联系人初始化
void InitContact(AdBook* pAdBook)
{
assert(pAdBook);
pAdBook->capacity = INIT_CON;
Con* p = (Con*)malloc(sizeof(Con) * pAdBook->capacity);
if (p == NULL)
{
printf("初始申请内存失败!\n");
exit(-1);//程序没必要继续下去,直接终止
}
else
{
pAdBook->ListMan = p;
pAdBook->number = 0;
p = NULL;
}
printf("联系人加载中!\n");
LoadContact(pAdBook);
printf("联系人加载完成!\n");
}
//增加联系人
void AddContact(AdBook* pAdBook)
{
assert(pAdBook);
if (pAdBook->capacity == pAdBook->number)
{
IncreaseContact(pAdBook);
}
Con tmp = { 0 };
InputContact(&tmp);
pAdBook->ListMan[pAdBook->number] = tmp;
pAdBook->number++;
printf("新建联系人成功!\n");
SaveContact(pAdBook);
}
//删除联系人
void DelContact(AdBook* pAdBook)
{
assert(pAdBook);
if (pAdBook->number == 0)
{
printf("联系人列表为空!\n");
}
else
{
char name[MAX_NAME] = { 0 };
printf("请输入需要删除联系人的姓名->");
scanf("%s", name);
int ret = SearchName(pAdBook, name);
if (ret >= 0)
{
int i = 0;
for (i = ret; i < pAdBook->number - 1; i++)
{
pAdBook->ListMan[i] = pAdBook->ListMan[i + 1];
}
pAdBook->number--;
printf("成功删除联系人:%s!\n", name);
}
else
{
printf("查无此人\n");
}
}
SaveContact(pAdBook);
}
//修改联系人
void ModContact(AdBook* pAdBook)
{
assert(pAdBook);
if (pAdBook->number <= 0)
{
printf("联系人列表为空,请新建联系人!\n");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入需要修改联系人的姓名->");
scanf("%s", name);
int ret = SearchName(pAdBook, name);
if (ret >= 0)
{
printf("请输入新联系人的信息!\n");
InputContact(pAdBook->ListMan + ret);
printf("修改联系人成功!\n");
}
else
{
printf("查无此人!无法修改!\n");
}
SaveContact(pAdBook);
}
//显示联系人
void ShowContact(AdBook* pAdBook)
{
assert(pAdBook);
printf("%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
int i = 0;
for (i = 0; i < pAdBook->number; i++)
{
printf("%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
pAdBook->ListMan[i].name,
pAdBook->ListMan[i].sex,
pAdBook->ListMan[i].age,
pAdBook->ListMan[i].tel,
pAdBook->ListMan[i].address,
pAdBook->ListMan[i].email);
}
}
//查找联系人
void FindContact(AdBook* pAdBook)
{
assert(pAdBook);
if (pAdBook->number == 0)
{
printf("联系人列表为空,无法进行查找!\n");
return;
}
char name[MAX_NAME] = { 0 };
printf("请输入需要查找的联系人姓名->");
scanf("%s", name);
int ret = SearchName(pAdBook, name);
if (ret >= 0)
{
PrintContact(pAdBook, ret);
}
else
{
printf("查无此人!\n");
}
}
//qsort的cmp函数
int cmp(const void* e1, const void* e2)
{
return strcmp(((Con*)e1)->name, ((Con*)e2)->name);
}
//排序联系人
void SotrContact(AdBook* pAdBook)
{
assert(pAdBook);
qsort(pAdBook->ListMan, pAdBook->number, sizeof(pAdBook->ListMan[0]), cmp);
printf("通讯录已经按姓名排序!\n");
ShowContact(pAdBook);
SaveContact(pAdBook);
}
//保存通讯录
void SaveContact(AdBook* pAdBook)
{
assert(pAdBook);
FILE* pf = fopen("contact.txt", "wb");//二进制数据保存,用于计算机读取
FILE* pf_read = fopen("通讯录.txt", "w+");//文本数据保存,用于用户阅读
if (pf == NULL || pf_read == NULL)
{
perror("file write:");
exit(-1);
}
int i = 0;
fprintf(pf_read, "%15s\t%5s\t%5s\t%15s\t%20s\t%20s\t\n\n", "联系人", "性别", "年龄", "电话", "地址", "邮箱");
for (i = 0; i < pAdBook->number; i++)
{
fwrite(pAdBook->ListMan + i, sizeof(Con), 1, pf);//计算机数据
fprintf(pf_read, "%15s\t%5s\t%5d\t%15s\t%20s\t%20s\t\n",
pAdBook->ListMan[i].name,
pAdBook->ListMan[i].sex,
pAdBook->ListMan[i].age,
pAdBook->ListMan[i].tel,
pAdBook->ListMan[i].address,
pAdBook->ListMan[i].email);//用户数据
}
fclose(pf);
fclose(pf_read);
pf = NULL;
pf_read = NULL;
}
🍹3.3菜单与测试文件
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
printf("*******************************\n");
printf("***** 通讯录2.0 文件版 *****\n");
printf("***** 1 添加联系人 *****\n");
printf("***** 2 删除联系人 *****\n");
printf("***** 3 查找联系人 *****\n");
printf("***** 4 修改联系人信息 *****\n");
printf("***** 5 排序联系人信息 *****\n");
printf("***** 6 显示联系人信息 *****\n");
printf("***** 0 退出并保存 *****\n");
printf("*******************************\n");
}
enum Founction
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
SHOW
};
struct AddressBook student;
int main()
{
int input = 0;
InitContact(&student);
do
{
menu();
printf("请输入菜单功能序号:");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&student);
break;
case DEL:
DelContact(&student);
break;
case SEARCH:
FindContact(&student);
break;
case MODIFY:
ModContact(&student);
break;
case SORT:
SotrContact(&student);
break;
case SHOW:
ShowContact(&student);
break;
case EXIT:
printf("退出通讯录成功!");
SaveContact(&student);
break;
default:
printf("输入字符非法!请重新输入!\n");
break;
}
} while (input);
return 0;
}
🌼4.总结
文件版的动态通讯录相比于传统的动态通讯录解决了文件数据存储与读取的问题,使文件的数据不丢失,极大的改善了用户体验!
- 点赞
- 收藏
- 关注作者
评论(0)