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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:10:24