C语言文件操作删除指定行时首行删除后留空白问题求助
问题原因
你的代码核心问题是行号递增和字符写入的判断顺序出错:
当前代码的执行顺序是:
- 读取单个字符
- 如果字符是换行符,先将行号
temp加1 - 再判断当前行号是否为待删除行,不是才写入字符
这种逻辑下,待删除行末尾的换行符会被特殊处理:当读取到待删除行的末尾换行时,行号会先递增为下一行的行号,此时判断行号不等于待删除行,这个换行符就会被写入新文件。
当你删除第1行时:
- 第1行的所有正文内容行号都是1,被判定为待删除,不会写入
- 读到第1行末尾的换行符时,
temp先加1变成2,判定不是待删除行,这个换行符就被写入了,最终导致文件开头多出来一个空白行。
删除后续行时没有明显感知,是因为前一行的换行和待删除行的换行连在一起,在部分显示场景下不容易发现,实际逻辑同样有缺陷。
另外你的代码还有两个隐性问题: - 头文件缺失:
#include后需要补充<stdio.h> - 字符变量类型错误:
getc返回值是int类型(要兼容EOF的负数值),你定义的char c如果是无符号字符类型,会无法正确判断EOF,建议改成int c
修复方案
只需要调整循环内的执行顺序:先判断行号决定是否写入字符,再处理换行符的行号递增即可,修改后的核心循环代码如下:
while( (c = getc(fp1)) != EOF ){ // 先判断是否写入当前字符 if (temp != del_line) { putc(c, fp2); } // 再处理行号递增 if (c == '\n') temp++; }
完整可运行的修复后代码:
#include <stdio.h> #define filename "file.txt" int main() { FILE *fp1, *fp2; int c; // 修正类型为int int del_line, temp = 1; fp1 = fopen(filename, "r"); // 增加文件打开失败判断,提升健壮性 if(fp1 == NULL) { perror("打开源文件失败"); return 1; } c = getc(fp1); while (c != EOF) { printf("%c", c); c = getc(fp1); } rewind(fp1); printf(" \n Enter line number of the line to be deleted:"); scanf("%d", &del_line); fp2 = fopen("copy.c", "w"); if(fp2 == NULL) { perror("打开临时文件失败"); fclose(fp1); return 1; } while( (c = getc(fp1)) != EOF ){ if (temp != del_line) { putc(c, fp2); } if (c == '\n') temp++; } fclose(fp1); fclose(fp2); remove(filename); rename("copy.c", filename); printf("\n The contents of file after being modified are as follows:\n"); fp1 = fopen(filename, "r"); c = getc(fp1); while (c != EOF) { printf("%c", c); c = getc(fp1); } fclose(fp1); return 0; }
内容的提问来源于stack exchange,提问作者CodeBeginner
相关产品推荐
相关产品推荐

