在之前的版本中,我们的通讯录系统已经实现了增加、删除、查找、修改、显示以及排序联系人信息等基本功能。然而,数据存储仅依赖于内存,一旦程序关闭,所有数据都将丢失。这在实际使用中显然是不够的,用户需要一个能够长期保存数据的通讯录。今天,我们将通过新增数据持久化功能,解决这个问题,让通讯录系统更加实用。 点击这里跳转前文:[c语言日寄]基于C语言的命令行通讯录管理系统
用户可以通过选择菜单中的“保存数据”选项,将当前通讯录中的所有联系人信息保存到本地文件中。系统会将联系人的性别、年龄、电话号码、姓名和地址等信息按照一定的格式写入到文件中。在保存之前,系统会提示用户确认操作,避免误操作导致数据丢失。如果用户确认保存,系统会覆盖原有数据文件,确保数据的更新。这一功能的实现,让用户不再担心程序关闭后数据丢失的问题,大大提高了数据的安全性。
为了方便用户在不同设备或不同时间使用通讯录,我们新增了数据读取功能。用户可以通过选择菜单中的“读取数据”选项,从本地文件中读取之前保存的联系人信息。系统提供了两种读取方式:覆盖原有内容和在原有内容后添加内容。如果用户选择覆盖原有内容,系统会先清空当前通讯录中的所有数据,然后从文件中读取数据并添加到通讯录中;如果用户选择在原有内容后添加内容,系统会直接将文件中的数据添加到当前通讯录的末尾。
为了确保数据的可读性和可扩展性,我们采用了简单的文本文件格式来存储联系人信息。每个联系人的信息占用一行,字段之间用空格分隔,具体格式为:性别 年龄 电话号码 姓名 地址。这种格式易于理解和解析,同时也方便用户手动编辑和查看数据文件。
在保存数据时,系统首先通过fopen
函数以写模式打开本地文件“address_book_data.txt”。如果文件打开失败,系统会提示用户并返回错误信息。如果文件打开成功,系统会遍历通讯录链表,将每个联系人的信息通过fprintf
函数按照指定的格式写入到文件中。写入完成后,关闭文件并提示用户保存成功。
ADD* save(ADD* head)
{
// 确认操作
system("cls");
printf("* 确定要保存数据吗?这将会覆盖原有数据:(Y/N)");
while (getchar() != '\n');
char check = 0;
if (scanf("%c", &check) <= 0)
{
perror("save - scanf");
return NULL;
}
if (check != 'Y')
{
system("cls");
printf("已取消保存。\n");
printf("---------------\n");
return NULL;
}
// 保存
FILE* data = fopen("address_book_data.txt","w");
if (data == NULL)
{
perror("save - fopen");
return NULL;
}
ADD* now = head->next;
while (now != NULL)
{
fprintf(data, "%c %d %s %s %s\n", now->sex, now->age, now->phone, now->name, now->address);
now = now->next;
}
fclose(data);
system("cls");
printf("数据保存成功!\n");
printf("-----------------\n");
return head;
}
在读取数据时,系统首先通过fopen
函数以读模式打开本地文件“address_book_data.txt”。如果文件打开失败,系统会提示用户并返回错误信息。如果文件打开成功,系统会根据用户选择的读取方式,执行相应的操作。
clear
函数清空当前通讯录链表,然后通过fscanf
函数从文件中逐行读取联系人信息,并动态分配内存创建新的联系人节点,将读取到的信息存储到节点中,最后将新节点链接到链表末尾。ADD* read(ADD* head)
{
system("cls");
again:
printf("# 请选择读取方式:\n");
printf(" 1.覆盖原有内容\n");
printf(" 2.在原有内容后添加内容\n");
printf("----------\n");
printf(" 0.取消读取\n");
printf("# 请输入操作数:");
int mode = 0;
if (scanf("%d",&mode) == 0)
{
perror("read-scanf");
return NULL;
}
switch (mode)
{
case 1:
// 清空链表
clear(head);
case 2:
read_2(position(head));
break;
case 0:
system("cls");
printf("已取消读取。\n");
printf("-------------\n");
return NULL;
default:
system("cls");
printf("操作符错误,请从新输入:\n");
printf("-------------\n");
goto again;//重新启动函数
}
system("cls");
printf("读取成功\n");
printf("-------------\n");
return head;
}
在数据保存和读取过程中,系统会通过清晰的操作提示引导用户进行操作。例如,在保存数据时,系统会提示用户确认操作,避免误操作导致数据丢失;在读取数据时,系统会提示用户选择读取方式,让用户能够根据自己的需求进行操作。这些操作提示不仅提高了用户操作的准确性,也增强了用户体验。
在文件处理过程中,可能会出现各种错误情况,如文件打开失败、读写错误等。为了提高系统的稳定性和可靠性,我们在代码中加入了详细的错误处理机制。如果出现错误,系统会通过perror
函数输出错误信息,让用户能够及时了解错误原因,并采取相应的措施。同时,系统会在出现错误时及时终止操作,避免对数据造成进一步的损坏。
为了确保新增功能的稳定性和可靠性,我们对数据保存和读取功能进行了全面的测试。测试用例包括但不限于以下几种情况:
经过测试,新增功能在各种情况下均表现良好,能够满足用户对数据持久化的需求。
本次通讯录系统的升级,新增了数据保存和读取功能,实现了数据的持久化存储。这一功能的实现,不仅解决了用户数据丢失的问题,还提高了数据的可移植性,让用户在不同设备之间能够轻松地同步通讯录数据。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有