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

问题描述 投票:1回答:1
#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 "时,它不能打印。

c io scanf
1个回答
2
投票

你可以很容易地使用 fgets 退货作为您的条件 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 返回。

限制 "%s" 也建议将指定者的大小与缓冲区的大小挂钩,这样可以避免缓冲区溢出,在这种情况下 "%14s""%29s" 分别为15个char和30个char的缓冲区,size - 1是指需要为null terminator保留一个空间。

你也应该按照 @pzaenger的评论 使用的问题 while(feof(fp) == 0).

© www.soinside.com 2019 - 2024. All rights reserved.