使用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; }
错误点分析
while(!feof(in))的逻辑缺陷:feof()只有在尝试读取超过文件末尾后才会返回真,因此最后一次循环时,fgetc(in)会返回EOF(无效字符),程序仍会进入循环并将EOF写入输出文件,表现为额外空行或乱码。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; }
关键修改说明
- 循环条件改为
while((c = fgetc(in)) != EOF):先执行读取操作,判断读取结果是否为有效字符,确保只处理文件内的实际内容,不会读取到EOF后再执行写入。 - 用
int存储fgetc返回值:保证能正确识别EOF,避免无效字符写入。 - 增加错误判断:避免文件打开失败时程序崩溃,提升健壮性。
- 改用
switch优化逻辑(可选):替换多分支if-else,代码更简洁易读。
额外排查点
如果修复后仍有多余空行,检查代码中是否存在额外的换行写入语句(比如fputc('\n', out)),这类语句会在文件末尾强制添加换行,直接删除即可。
内容的提问来源于stack exchange,提问作者springbook
相关产品推荐
相关产品推荐

