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

C语言实现删除文件中指定ID对应人物信息块问题求助

问题描述

我的作业要处理一个存储人物信息的文本文件,每个人物的信息块用-分隔,里面包含姓名、ID、地址这类内容。程序得通过命令行参数接收操作指令(比如DELETE)、目标ID和文件名。现在的代码能匹配到目标ID并给出提示,但删不掉对应的整个信息块,之前试了计数分割块的方法没成功,求解决思路和代码示例。

现有代码

主函数片段

if(strcmp(argv[1], "DELETE") == 0 && strcmp(argv[3], "mirsham.txt") == 0)
{
    char ID[15];
    strcpy(ID, argv[2]);
    deletePerson(fp, ID);
}

deletePerson函数

void deletePerson(FILE *fp, char ID[])
{
    char buffer[6000];

    fp = fopen("mirsham.txt", "r");
    if (fp == NULL)
    {
        printf("Error opening file!");
        return;
    }

    while (fgets(buffer, 6000, fp) != NULL)
    {
        if ((strstr(buffer, ID)) != NULL)
        {
            fprintf(stdout, "Match found!");
        }
        else
        {
            fprintf(stdout, "No match found");
            break;
        }
    }
}
解决思路
  • 核心问题是原代码逐行处理,但人物信息是块级的,得先按-把整个文件拆成独立的信息块
  • 不能直接在原文件上修改,建议用临时文件:先读取所有信息块,把不含目标ID的块写入临时文件,最后用临时文件替换原文件
  • 要处理块的边界情况,比如文件开头/结尾的分隔符,避免出现多余的分隔符
  • 注意文件操作的错误处理,比如文件打不开、读写失败的情况
代码示例

下面是修改后的完整实现,用临时文件完成删除操作:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void deletePerson(const char *filename, char ID[])
{
    FILE *fp = fopen(filename, "r");
    if (fp == NULL)
    {
        printf("Error opening file!\n");
        return;
    }

    // 创建临时文件
    FILE *temp_fp = fopen("temp_mirsham.txt", "w");
    if (temp_fp == NULL)
    {
        printf("Error creating temp file!\n");
        fclose(fp);
        return;
    }

    char buffer[6000];
    char current_block[6000] = {0};
    int in_block = 0;

    // 逐行读取,拼接成完整的信息块
    while (fgets(buffer, 6000, fp) != NULL)
    {
        // 判断是否是分隔符行(假设分隔符是单独一行的'-')
        if (strcmp(buffer, "-\n") == 0 || strcmp(buffer, "-") == 0)
        {
            // 如果当前有拼接好的块,先处理
            if (in_block)
            {
                // 检查当前块是否包含目标ID,不包含就写入临时文件
                if (strstr(current_block, ID) == NULL)
                {
                    fprintf(temp_fp, "%s", current_block);
                    fprintf(temp_fp, "-\n"); // 写入分隔符
                }
                // 重置当前块
                memset(current_block, 0, sizeof(current_block));
                in_block = 0;
            }
        }
        else
        {
            // 拼接当前行到信息块
            strcat(current_block, buffer);
            in_block = 1;
        }
    }

    // 处理文件最后一个没有分隔符的块
    if (in_block)
    {
        if (strstr(current_block, ID) == NULL)
        {
            fprintf(temp_fp, "%s", current_block);
        }
    }

    // 关闭文件
    fclose(fp);
    fclose(temp_fp);

    // 删除原文件,把临时文件重命名为原文件名
    remove(filename);
    rename("temp_mirsham.txt", filename);

    printf("Delete operation completed!\n");
}

// 主函数调整
int main(int argc, char *argv[])
{
    if (argc != 4)
    {
        printf("Usage: %s DELETE <ID> <filename>\n", argv[0]);
        return 1;
    }

    if(strcmp(argv[1], "DELETE") == 0)
    {
        char ID[15];
        strcpy(ID, argv[2]);
        deletePerson(argv[3], ID); // 直接传文件名,不用提前打开
    }

    return 0;
}

说明

  • 假设分隔符是单独一行的-,如果你的文件分隔符格式不同(比如多个-或者带空格),可以修改分隔符的判断条件
  • 用临时文件操作避免原文件损坏,操作完成后替换原文件
  • 处理了文件末尾没有分隔符的情况,避免丢失最后一个信息块

内容的提问来源于stack exchange,提问作者Amirkh7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:24:21