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

使用Buffer Size时C程序输出底部多出空行的问题修复请求

问题定位与修复方案

输出文件底部多出空行的核心原因,几乎都是字符读取/写入的循环逻辑错误,最常见的两种情况:

  • 使用while(!feof(fp))作为循环条件,导致读取到EOF后仍执行写入操作
  • 用char类型存储fgetc的返回值,无法正确识别EOF,引发无效字符写入

常见错误代码示例

假设你的原代码类似如下(典型错误写法):

#include <stdio.h>

int main() {
    FILE *in = fopen("input.txt", "r");
    FILE *out = fopen("output.txt", "w");
    char c;
    while (!feof(in)) {
        c = fgetc(in);
        if (c == 'R') fputs("RoR", out);
        else if (c == 'r') fputs("ror", out);
        else if (c == 'S') fputs("SoS", out);
        else if (c == 's') fputs("sos", out);
        else if (c == 'T') fputs("ToT", out);
        else if (c == 't') fputs("tot", out);
        else fputc(c, out);
    }
    fclose(in);
    fclose(out);
    return 0;
}

错误点分析

  1. while(!feof(in))的逻辑缺陷:feof()只有在尝试读取超过文件末尾后才会返回真,因此最后一次循环时,fgetc(in)会返回EOF(无效字符),程序仍会进入循环并将EOF写入输出文件,表现为额外空行或乱码。
  2. char存储fgetc返回值:fgetc()返回int类型(包含EOF,通常为-1),若用char存储,当char为无符号类型时,-1会被转换为255,导致无法正确判断EOF,进而触发错误写入。

修复后的代码

#include <stdio.h>

int main() {
    FILE *in = fopen("input.txt", "r");
    FILE *out = fopen("output.txt", "w");
    
    // 增加文件打开失败的错误判断
    if (!in || !out) {
        perror("Failed to open file");
        return 1;
    }
    
    int c; // 用int存储fgetc返回值,兼容EOF判断
    // 正确循环:读取到有效字符才处理
    while ((c = fgetc(in)) != EOF) {
        switch(c) {
            case 'R': fputs("RoR", out); break;
            case 'r': fputs("ror", out); break;
            case 'S': fputs("SoS", out); break;
            case 's': fputs("sos", out); break;
            case 'T': fputs("ToT", out); break;
            case 't': fputs("tot", out); break;
            default: fputc(c, out); break;
        }
    }
    
    fclose(in);
    fclose(out);
    return 0;
}

关键修改说明

  1. 循环条件改为while((c = fgetc(in)) != EOF):先执行读取操作,判断读取结果是否为有效字符,确保只处理文件内的实际内容,不会读取到EOF后再执行写入。
  2. 用int存储fgetc返回值:保证能正确识别EOF,避免无效字符写入。
  3. 增加错误判断:避免文件打开失败时程序崩溃,提升健壮性。
  4. 改用switch优化逻辑(可选):替换多分支if-else,代码更简洁易读。

额外排查点

如果修复后仍有多余空行,检查代码中是否存在额外的换行写入语句(比如fputc('\n', out)),这类语句会在文件末尾强制添加换行,直接删除即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:47:39