C语言如何删除/替换文本文件字符?作业移除空行失败求助
移除文本文件空行的C程序实现方案
原方案的问题分析
- 第一种方案试图通过覆盖字符实现,但
r+模式下读写交替的指针偏移逻辑混乱,off的计算与fseek的位置没有正确匹配;另外用fputc(EOF, fp)截断文件是错误操作——EOF是文件结束的逻辑标志,并非可写入的字符,无法真正截断文件内容。 - 第二种方案用
'\0'替换换行符,本质没有移除空行,只是将换行符替换为空字符,文件大小不变;而且文本处理时遇到'\0'会提前终止读取,反而引发新的问题。
正确实现思路
处理文件内容修改的稳妥方式是读写分离:先读取原文件内容,过滤空行后写入临时文件,最后用临时文件替换原文件。这种方式逻辑清晰,避免直接修改原文件带来的数据损坏风险。
完整代码实现
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LEN 1000 int main() { FILE *src_fp = fopen("sortie.txt", "r"); FILE *tmp_fp = fopen("sortie_tmp.txt", "w"); char line[MAX_LINE_LEN]; int last_line_empty = 0; // 标记上一行是否为空行,避免连续空行 if (!src_fp || !tmp_fp) { perror("文件打开失败"); return EXIT_FAILURE; } while (fgets(line, MAX_LINE_LEN, src_fp) != NULL) { // 去除行尾的换行符、回车符及空白字符,判断是否为空行 size_t len = strlen(line); while (len > 0 && (line[len-1] == '\n' || line[len-1] == '\r' || line[len-1] == ' ' || line[len-1] == '\t')) { line[--len] = '\0'; } // 当前行非空则写入,同时重置空行标记 if (len > 0) { fprintf(tmp_fp, "%s\n", line); last_line_empty = 0; } // 如需保留单个空行(避免连续空行),可启用以下分支;完全移除空行则直接删除该分支 // else if (!last_line_empty) { // fprintf(tmp_fp, "\n"); // last_line_empty = 1; // } } fclose(src_fp); fclose(tmp_fp); // 替换原文件,失败则清理临时文件 if (remove("sortie.txt") != 0 || rename("sortie_tmp.txt", "sortie.txt") != 0) { perror("文件替换失败"); remove("sortie_tmp.txt"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
代码关键点说明
- 用
fgets逐行读取,简化单字符处理的复杂逻辑; - 清理行尾空白字符,准确判断空行(避免将仅含空格的行误判为有效行);
- 通过
last_line_empty标记控制空行输出,可灵活选择保留单个空行或完全移除所有空行; - 采用临时文件中转,保证原文件在处理异常时不会损坏;
- 加入完整的错误处理,包括文件操作失败的提示和资源清理。
内容的提问来源于stack exchange,提问作者YellowFlash
相关产品推荐
相关产品推荐

