前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[c语言日寄]通讯录pro版:文件操作

[c语言日寄]通讯录pro版:文件操作

作者头像
siy2333
发布于 2025-03-31 10:41:17
发布于 2025-03-31 10:41:17
6800
代码可运行
举报
文章被收录于专栏:来自csdn的博客来自csdn的博客
运行总次数:0
代码可运行

前言

在之前的版本中,我们的通讯录系统已经实现了增加、删除、查找、修改、显示以及排序联系人信息等基本功能。然而,数据存储仅依赖于内存,一旦程序关闭,所有数据都将丢失。这在实际使用中显然是不够的,用户需要一个能够长期保存数据的通讯录。今天,我们将通过新增数据持久化功能,解决这个问题,让通讯录系统更加实用。 点击这里跳转前文:[c语言日寄]基于C语言的命令行通讯录管理系统


功能升级介绍

数据保存功能

用户可以通过选择菜单中的“保存数据”选项,将当前通讯录中的所有联系人信息保存到本地文件中。系统会将联系人的性别、年龄、电话号码、姓名和地址等信息按照一定的格式写入到文件中。在保存之前,系统会提示用户确认操作,避免误操作导致数据丢失。如果用户确认保存,系统会覆盖原有数据文件,确保数据的更新。这一功能的实现,让用户不再担心程序关闭后数据丢失的问题,大大提高了数据的安全性。

数据读取功能

为了方便用户在不同设备或不同时间使用通讯录,我们新增了数据读取功能。用户可以通过选择菜单中的“读取数据”选项,从本地文件中读取之前保存的联系人信息。系统提供了两种读取方式:覆盖原有内容和在原有内容后添加内容。如果用户选择覆盖原有内容,系统会先清空当前通讯录中的所有数据,然后从文件中读取数据并添加到通讯录中;如果用户选择在原有内容后添加内容,系统会直接将文件中的数据添加到当前通讯录的末尾。


技术实现细节

文件存储格式

为了确保数据的可读性和可扩展性,我们采用了简单的文本文件格式来存储联系人信息。每个联系人的信息占用一行,字段之间用空格分隔,具体格式为:性别 年龄 电话号码 姓名 地址。这种格式易于理解和解析,同时也方便用户手动编辑和查看数据文件。

保存数据实现

在保存数据时,系统首先通过fopen函数以写模式打开本地文件“address_book_data.txt”。如果文件打开失败,系统会提示用户并返回错误信息。如果文件打开成功,系统会遍历通讯录链表,将每个联系人的信息通过fprintf函数按照指定的格式写入到文件中。写入完成后,关闭文件并提示用户保存成功。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函数从文件中逐行读取联系人信息,并动态分配内存创建新的联系人节点,将读取到的信息存储到节点中,最后将新节点链接到链表末尾。
  • 如果用户选择在原有内容后添加内容,系统会直接将文件中的数据添加到链表末尾。读取完成后,关闭文件并提示用户读取成功。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函数输出错误信息,让用户能够及时了解错误原因,并采取相应的措施。同时,系统会在出现错误时及时终止操作,避免对数据造成进一步的损坏。


测试与验证

为了确保新增功能的稳定性和可靠性,我们对数据保存和读取功能进行了全面的测试。测试用例包括但不限于以下几种情况:

  1. 保存数据测试
    • 保存空通讯录数据,验证文件是否正确生成且为空。
    • 保存包含多个联系人的通讯录数据,验证文件内容是否正确。
    • 连续多次保存数据,验证数据是否正确覆盖。
  2. 读取数据测试
    • 读取空文件,验证系统是否正确提示用户文件为空。
    • 读取包含多个联系人的数据文件,验证数据是否正确读取并添加到通讯录中。
    • 读取格式错误的文件,验证系统是否正确提示用户文件格式错误。
    • 覆盖原有内容读取数据,验证原有数据是否被正确清空并替换为新数据。
    • 在原有内容后添加内容读取数据,验证新数据是否正确添加到通讯录末尾。

经过测试,新增功能在各种情况下均表现良好,能够满足用户对数据持久化的需求。


总结

本次通讯录系统的升级,新增了数据保存和读取功能,实现了数据的持久化存储。这一功能的实现,不仅解决了用户数据丢失的问题,还提高了数据的可移植性,让用户在不同设备之间能够轻松地同步通讯录数据。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 功能升级介绍
    • 数据保存功能
    • 数据读取功能
  • 技术实现细节
    • 文件存储格式
    • 保存数据实现
    • 读取数据实现
  • 用户体验优化
    • 操作提示
    • 错误处理
  • 测试与验证
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档