#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
退货作为您的条件 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)
.