为什么文本文件中的特定行没有被替换而是被删除?

Why is specific line in text file not replaced but instead deleted?

我有这个程序,我可以在其中输入学生人数、他们的姓名以及他们在预赛、期中考试和期末考试中的相应成绩。所有这些用户输入的数据都将放在一个文本文件中。

我尝试创建一个编辑功能来更新文本文件中包含学生姓名和成绩的特定行。

但是它没有用新更新的数据替换它,而是删除了它。

这是我的 write 函数和 getScore 函数的源代码,它们将允许用户将数据(例如学生姓名和成绩)输入文本文件:

#define max 256

    void write()
    {
        system("cls");
        printf("\n Enter the number of students: ");
        scanf("%d", &numberOfStudents);
    
        FILE *fp;

    fp = (fopen("studentRecord.txt", "a"));
    if (fp == NULL)
    {
        printf("\n Error!");
        exit(1);
    }

    fprintf(fp, " Name \t \t Prelims \t Midterms \t Finals \t Average \t Rating \n");
    for (i = 0; i < numberOfStudents; ++i)
    {
        printf("\n Student No. %d ", i + 1);
        getScore(studentName, &prelims, &midterms, &finals);

        /******This is just another function for computing the average scores******/
        averageScores = average(prelims, midterms, finals);

        /******This is just also another function for rating the average scores******/
        rating = rate(averageScores);

        fprintf(fp, " %d.) %s \t %d \t \t %d \t \t %d \t \t %.2f \t \t %.2f \n", i + 1, studentName, prelims, midterms, finals, averageScores, rating);
    }

    fclose(fp);
    printf("\n \n File studentRecord.txt is saved!");
    getch();
    view();
}

void getScore(char *studentName, int *prelims, int *midterms, int *finals)
{
    printf("Name: ");
    scanf("%s", studentName);

    printf("\n \t Prelims: ");
    scanf("%d", prelims);

    printf("\n \t Midterms: ");
    scanf("%d", midterms);

    printf("\n \t Finals: ");
    scanf("%d", finals);
}

这是我的编辑功能的源代码,它应该允许用户编辑文本文件中的特定行:

void edit()
{
    system("cls");
    FILE *fpo;
    FILE *fp2;

    int lno, linectr = 0;
    char str[max];
    char newln[max], temp[] = "temp.txt";

    printf("\n Input the file to be opened: ");
    fgets(file_name, max, stdin);
    file_name[strlen(file_name) - 1] = '[=11=]';

    fpo = fopen(file_name, "r");

    if (!fpo)
    {
        printf("\n Unable to open the input file!");
        main();
    }

    fp2 = fopen(temp, "w");
    if (!fp2)
    {
        printf("\n Unable to open a temporary file to write!");
        fclose(fpo);
        main();
    }

    printf("\n Input the line number you want to update: ");
    scanf("%d", &lno);


    printf("\n Student No. %d ", lno);
    getScore(studentName, &prelims, &midterms, &finals);
    averageScores = average(prelims, midterms, finals);
    rating = rate(averageScores);

    fprintf(fp, " %d.) %s \t %d \t \t %d \t \t %d \t \t %.2f \t \t %.2f \n", lno, studentName, prelims, midterms, finals, averageScores, rating);

    lno++;


    while (!feof(fpo))
    {
        strcpy(str, "[=11=]");
        fgets(str, max, fpo);
        if (!feof(fpo))
        {
            linectr++;
            if (linectr != lno)
            {
                fprintf(fp2, "%s", str);
            }
            else
            {
                fprintf(fp2, "%s", newln);
            }
        }
    }

    fclose(fpo);
    fclose(fp2);
    remove(file_name);
    rename(temp, file_name);
    getch();
    view();
}

编译后运行,是这样的:

这些是用户在文本文件中输入的数据

这是我尝试更新第 3 行数据的时候

最后,这是我尝试查看本应包含新数据的文本文件的更新内容。

应该更新的行被删除了。

请检查我的代码是否有问题。有人指出错误会很有帮助

复制循环使用 feof() 来尝试检测文件结尾,但这种方法是不正确的:您应该只使用 fgets() 的 return 值,这将是一个如果无法从文件中读取任何行,则为空指针。

    while (fgets(str, max, fpo)) {
        linectr++;
        if (linectr == lno) {
            fputs(newln, fp2);
        } else {
            fputs(str, fp2);
        }
    }

如需进一步说明,请阅读 Why is “while ( !feof (file) )” always wrong?

另请注意,您应该使用 snprintf 而不是 fprintf 来组成新行内容:

sprintf(newln, sizeof newln, " %d.) %s \t %d \t \t %d \t \t %d \t \t %.2f \t \t %.2f \n",
        lno, studentName, prelims, midterms, finals, averageScores, rating);

行号也不应更新:删除 lno++; 语句。