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。
#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)
的使用,您还应该遵循