sscanf 无法读取文本文件的最后一行

sscanf can't read last line of the text file

#include <stdio.h>

int main()
{

    FILE *fp;
    char buffer[1001];
    char name[15], surname[30];
    float mid1, mid2, final, avg;

    fp = fopen("grades.txt", "r");
    if (!fp)
    {
        printf("Could not open file. Program finished.");
        return 0;
    }

    fgets(buffer, 1000, fp);

    while (feof(fp) == 0)
    {
        sscanf(buffer, "%s%s%f%f%f", name, surname, &mid1, &mid2, &final);

        printf("%s %s %f %f %f\n", name, surname, mid1, mid2, final);

        fgets(buffer, 1000, fp);
    }

    fclose(fp);

    return 0;
}

这是我的文本文件,

Ali Veli 67 80 76
Ahmet Mehmet 45 64 63
Ayse Fatma 89 98 83

一切正常,但无法读取文本文件的最后一行 在输出中 "Ayse Fatma 89 98 83" 无法打印。

您可以轻松地使用 fgets return 的值作为您的 while 循环的条件:

while(fgets(buffer, sizeof(buffer), fp))
{
    if(sscanf(buffer, "%14s%29s%f%f%f", name, surname, &mid1, &mid2, &final) == 5)
        printf("%s %s %f %f %f\n",name,surname,mid1,mid2,final);
}

当没有更多行可从文件中读取时,循环将停止。

此外,一个好的做法是始终检查 *scanf return。

还建议将 "%s" 说明符的大小限制在其缓冲区内,这将避免缓冲区溢出,在这种情况下,"%14s""%29s" 分别用于 15 个字符和 30 个字符的缓冲区,大小- 1 涉及到需要为空终止符保留一个 space。

关于 while(feof(fp) == 0) 的使用,您还应该遵循 中的 link。