【问题标题】:Why does C program(to delete a line) delete the first character of my .txt file?为什么 C 程序(删除一行)会删除我的 .txt 文件的第一个字符?
【发布时间】:2021-04-09 21:39:23
【问题描述】:

我在 Internet 上找到了用于删除 .txt 文件中特定行的代码。问题是它还删除了文件的第一个字符。例如:txt文件中的内容-

测试线 1

测试线 2

测试线 3

测试线 4

删除第二行后的内容-

第一行

测试线 3

测试线 4

网站上的代码可以在here找到。

代码是:

/*
 * C Program Delete a specific Line from a Text File
 */

#include <stdio.h>

int main()

{

    FILE *fp1, *fp2;

    char filename[100];
    char filename2[100];

    char ch;

    int delete_line, temp = 1;



    printf("Enter file name: ");

    scanf("%s", filename);
    sprintf(filename2, "%s.txt", filename);

    //open file in read mode

    fp1 = fopen(filename2, "r");

    ch = getc(fp1);

    while (ch != EOF)

    {

        printf("%c", ch);

        ch = getc(fp1);

    }

    //rewind

    rewind(fp1);

    printf(" \n Enter line number of the line to be deleted:");

    scanf("%d", &delete_line);

    //open new file in write mode

    fp2 = fopen("replica.c", "w");

    ch = getc(fp1);

    while (ch != EOF)

    {

        ch = getc(fp1);

        if (ch == '\n')

            temp++;

        //except the line to be deleted

        if (temp != delete_line)

        {

            //copy all lines in file replica.c

            putc(ch, fp2);

        }

    }

    fclose(fp1);

    fclose(fp2);

    remove(filename2);

    //rename the file replica.c to original name

    rename("replica.c", filename2);

    printf("\n The contents of file after being modified are as follows:\n");

    fp1 = fopen(filename2, "r");

    ch = getc(fp1);

    while (ch != EOF)

    {

        printf("%c", ch);

        ch = getc(fp1);

    }

    fclose(fp1);

    return 0;

}

【问题讨论】:

  • 您是否尝试过自己调试?如果是这样,您应该可以看到第一个getc 结果被丢弃了。

标签: c file file-io


【解决方案1】:

您在第二个循环中调用 getc() 两次,因此您评估的第一个字符是文件的第二个字符。
您只需像这样在循环结束时调用 getc() :

ch = getc(fp1);

while (ch != EOF)

{

    if (ch == '\n')

        temp++;

    //except the line to be deleted

    if (temp != delete_line)

    {

        //copy all lines in file replica.c

        putc(ch, fp2);

    }

    ch = getc(fp1);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多