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
相关产品推荐
相关产品推荐

