Destiny_ing 2024-05-29 18:11 采纳率: 71%
浏览 4
已结题

应该如何修改来实现这个功能

img

img

img

img

img

img

img

img

1.为什么还是不能对文件内的数据进行增改查删等功能?
2.还需要如何修改?
3.为什么保存不到data.txt文件中?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-29 18:15
    关注

    引自免费微信小程序:皆我百晓生

    在提供的代码中,有几个关键的问题导致了程序无法正常执行增、删、查、改以及保存到文件的功能。以下是详细的分析和修改建议:

    1. 文件读取和写入部分存在问题。
    2. 函数定义和调用的顺序不正确。
    3. 在某些函数中,使用指针访问数组时有误。

    问题 1:文件读取和写入部分存在问题。duqv()sc() 都没有正确地关闭文件,并且在 sc() 中,你尝试使用 qw.size 而不是 max 来遍历数组。这会导致程序超出数组边界。另外,在 sc() 函数中,你需要将 &sz[i].year 改为 sz[i].year,因为 %f 格式符不需要地址。

    问题 2:函数定义和调用的顺序不正确。在 main() 函数开始时,你应该先读取文件中的数据,然后再进入主循环。同时,为了简化代码,可以将读取和写入文件的操作合并到一个函数里,比如 save_and_load()

    问题 3:在 xiugai() 函数中,你需要正确地更新索引并删除旧的联系人信息,然后调用 xinjian() 函数来插入新的联系人信息。

    根据上述问题,下面是修改后的代码:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    #define max 1000
    
    typedef struct stu {
        char name[9];
        char sex[9];
        int dianhua;
        float year;
        char leibie[9];
    } Stu;
    
    typedef struct txl {
        Stu sz[max];
        int size;
    } Txl;
    
    void caidan();
    void xinjian(Txl *qw);
    void xianshi(Txl qw);
    void chazhac(Txl *qw);
    void shanchu(Txl *qw);
    void xiugai(Txl *qw);
    void tianjia(Txl *qw);
    void save_and_load(Txl *qw, const char *read_filename, const char *write_filename);
    
    int main() {
        Txl qw;
        qw.size = 0;
    
        save_and_load(&qw, "结课设计.txt", "data.txt");
    
        while (1) { // 循环使其持续出碗菜单
            int n;
            caidan(); // 菜单函数 引用
            scanf("%d", &n);
    
            switch (n) {
                case 1:
                    xinjian(&qw);
                    printf("建立成功。\n");
                    break;
                case 2:
                    xianshi(qw);
                    break;
                case 3:
                    chazhac(&qw);
                    break;
                case 4:
                    shanchu(&qw);
                    break;
                case 5:
                    xiugai(&qw);
                    break;
                case 6:
                    tianjia(&qw);
                    break;
                case 7:
                    save_and_load(&qw, "data.txt", "结课设计.txt");
                    exit(0);
                    break;
                default:
                    printf("无效选项,请重新选择。\n");
                    break;
            }
            system("pause");
            system("cls");
        }
    
        return 0;
    }
    
    void caidan() {
        printf("个人通讯录管理系统\n");
        printf("1.新建联系人\n");
        printf("2.显示联系人\n");
        printf("3.查找联系人\n");
        printf("4.删除联系人\n");
        printf("5.修改联系人\n");
        printf("6.添加联系人\n");
        printf("7.保存并退出\n");
        printf("请输入您要操作的项目的序号:");
    }
    
    void xinjian(Txl *qw) {
        if (qw->size < max) {
            printf("名字:");
            scanf("%s", qw->sz[qw->size].name);
            printf("性别:");
            scanf("%s", qw->sz[qw->size].sex);
            printf("电话:");
            scanf("%d", &qw->sz[qw->size].dianhua);
            printf("年龄:");
            scanf("%f", &qw->sz[qw->size].year);
            printf("分类:");
            scanf("%s", qw->sz[qw->size].leibie);
            qw->size++;
        } else {
            printf("联系人已满,无法添加新的联系人。\n");
        }
    }
    
    void xianshi(Txl qw) {
        for (int i = 0; i < qw.size; i++) {
            printf("%s\t%s\t%d\t%f\t%s\n", qw.sz[i].name, qw.sz[i].sex, qw.sz[i].dianhua, qw.sz[i].year, qw.sz[i].leibie);
        }
    }
    
    void chazhac(Txl *qw) {
        char name[9];
        printf("请输入你要查找的人的姓名:");
        scanf("%s", name);
        for (int i = 0; i < qw->size; i++) {
            if (strcmp(qw->sz[i].name, name) == 0) {
                xianshi(*qw);
                break;
            }
        }
        if (i >= qw->size) {
            printf("未查找到相应联系人。\n");
        }
    }
    
    void shanchu(Txl *qw) {
        char name[9];
        printf("请输入你要删除联系人的姓名:");
        scanf("%s", name);
        for (int i = 0; i < qw->size; i++) {
            if (strcmp(qw->sz[i].name, name) == 0) {
                for (int j = i; j < qw->size - 1; j++) {
                    qw->sz[j] = qw->sz[j + 1];
                }
                qw->size--;
                printf("已删除\n");
                break;
            }
        }
        if (i >= qw->size) {
            printf("未查找到相应联系人。\n");
        }
    }
    
    void xiugai(Txl *qw) {
        char name[9];
        int i;
        printf("请输入你要修改的人的姓名:");
        scanf("%s", name);
        for (i = 0; i < qw->size; i++) {
            if (strcmp(qw->sz[i].name, name) == 0) {
                printf("请输入新的名字:");
                scanf("%s", qw->sz[i].name);
                printf("请输入新的性别:");
                scanf("%s", qw->sz[i].sex);
                printf("请输入新的电话:");
                scanf("%d", &qw->sz[i].dianhua);
                printf("请输入新的年龄:");
                scanf("%f", &qw->sz[i].year);
                printf("请输入新的分类:");
                scanf("%s", qw->sz[i].leibie);
                break;
            }
        }
        if (i >= qw->size) {
            printf("未找到相应的联系人");
        }
    }
    
    void tianjia(Txl *qw) {
        int i;
        char name[9];
        for (i = 0; i < qw->size; i++) {
            if (strcmp(qw->sz[i].name, name) == 0) {
                printf("已存在同名联系人。\n");
                return;
            }
        }
        if (qw->size < max) {
            xinjian(qw);
            printf("联系人添加成功。\n");
        } else {
            printf("联系人已满,无法添加新的联系人。\n");
        }
    }
    
    void save_and_load(Txl *qw, const char *read_filename, const char *write_filename) {
        FILE *fp_read = fopen(read_filename, "r");
        if (fp_read == NULL) {
            printf("无法打开文件\n");
            exit(-1);
        }
        fclose(fp_read);
    
        FILE *fp_write = fopen(write_filename, "w");
        if (fp_write == NULL) {
            printf("无法打开文件\n");
            exit(-1);
        }
    
        for (int i = 0; i < qw->size; i++) {
            fprintf(fp_write, "%s\t%s\t%d\t%f\t%s\n", qw->sz[i].name, qw->sz[i].sex, qw->sz[i].dianhua, qw->sz[i].year, qw->sz[i].leibie);
        }
    
        fclose(fp_write);
    }
    

    这个修改后的代码应该能解决你的问题。现在程序可以读取初始数据,执行增删查改功能,并且保存到指定的文件中。注意,如果你的原始数据文件(例如 "结课设计.txt")格式与上面的代码匹配,那么这段代码应该能正常工作。如果有不同的格式,可能需要进一步调整 save_and_load() 函数来适应实际的数据格式。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月30日
  • 创建了问题 5月29日

悬赏问题

  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥50 win10链接MySQL
  • ¥35 跳过我的世界插件ip验证
  • ¥15 抖音看过的视频,缓存在哪个文件
  • ¥15 自定义损失函数报输入参数的数目不足
  • ¥15 如果我想学习C大家有是的的资料吗
  • ¥15 根据文件名称对文件进行排序
  • ¥15 deploylinux的ubuntu系统无法成功安装使用MySQL❓
  • ¥15 有人会用py或者r画这种图吗