You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除文件行后视图函数仍显示原数据的问题求助

删除文件行后视图函数仍显示原数据的问题求助

嘿,我一眼就瞅出问题所在啦!你的view函数完全没发挥“从文件读取最新数据”的作用——它只是象征性地打开了文件,却从头到尾都在输出内存里旧的contact数组内容,根本没去读修改后的文件!

咱们来拆解下问题:

  • 你的delete函数确实修改了文件内容,也把count减了1,但它只更新了文件和count变量,没同步更新内存里的contact数组,数组里还留着删除前的所有数据
  • 而view函数里,你打开文件后直接就循环count次输出contact[i]的内容,完全没从文件里重新读取解析数据,所以自然显示的还是旧数组里的内容,只是因为count减了1,最后一条没显示而已

解决办法

你需要让view函数每次调用时都从文件重新读取并解析数据,而不是依赖内存里的旧数据。这里给你修改后的view函数示例:

void view() {
    FILE *file1 = fopen("SavedContacts.txt", "r");
    if (file1 == NULL) {
        printf("ERROR: Unable to open file.\n");
        return;
    }

    printf("\t\t Contacts: \n \n");
    char line[100];
    // 重置count,避免旧数据的计数干扰
    count = 0;
    // 逐行读取文件并解析到contact数组
    while (fgets(line, sizeof(line), file1)) {
        char *token = strtok(line, ":");
        if (token == NULL) continue;
        
        // 解析姓名
        strcpy(contact[count].name, token);
        // 解析电话号码(注意跳过前面的空格)
        token = strtok(NULL, ",");
        if (token == NULL) continue;
        strcpy(contact[count].pn, token + 1);
        // 解析邮箱(同样跳过前面的空格)
        token = strtok(NULL, "\n");
        if (token == NULL) continue;
        strcpy(contact[count].email, token + 1);
        
        // 输出当前解析的联系人
        printf("%s: %s, %s\n", contact[count].name, contact[count].pn, contact[count].email);
        count++;
    }
    fclose(file1);
}

另外还要提醒你:你的delete函数里有个严重的内存bug——char *token; strcpy(token, line);这里的token是未初始化的野指针,直接用strcpy会导致程序崩溃或者莫名其妙的错误!应该改成char token[100];来分配一块固定内存,再执行strcpy,或者直接用line来做分割操作。

备注:内容来源于stack exchange,提问作者Kaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:14:29