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

C语言文件操作删除指定行时首行删除后留空白问题求助

问题原因

你的代码核心问题是行号递增和字符写入的判断顺序出错:
当前代码的执行顺序是:

  1. 读取单个字符
  2. 如果字符是换行符,先将行号temp加1
  3. 再判断当前行号是否为待删除行,不是才写入字符
    这种逻辑下,待删除行末尾的换行符会被特殊处理:当读取到待删除行的末尾换行时,行号会先递增为下一行的行号,此时判断行号不等于待删除行,这个换行符就会被写入新文件。
    当你删除第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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 18:15:05