为什么fscanf不能把数据读到结构体中去,求解答

#include"stdio.h"
typedef struct Stu
{
int no;
char name[6];
int grade;
}sstu,*psstu;

int main(int argc, char const *argv[])
{
FILE *in,*out;
char str[100];
int n,i,sum=0;
float ave;
while ((in=fopen("a.txt","r+"))==NULL)
{
printf("不能打开源文件\n");
}
while ((out=fopen("b.txt","w+"))==NULL)
{
printf("不能打开目标文件\n");
}
while (fgets(str,100,in))
{
fputs(str,out);
}
fseek(in,0,2);
n=ftell(in);
printf("%d\n",n);
printf("%d\n",sizeof(struct Stu));
n=n/sizeof(struct Stu);
printf("有%d个学生的数据\n",n);
struct Stu t[n];
for(i=0;i<n;i++)
{
fscanf(in,"%d %s %d",&t[i].no,t[i].name,&t[i].grade);
}
for ( i = 0; i < n; i++)
{
printf("%d\t",t[i].grade);
}
for ( i = 0; i < n; i++)
{
sum=sum+t[i].grade;
}
ave=sum/n;
printf("平均成绩是%d",ave);
fclose(in);
fclose(out);
return 0;
}

txt文件的格式是这样的:
3011 张三 91
3012 李四 96
3013 王五 98
3014 赵六 55

  1. 通过文件大小(字节数)来判断记录个数是不正确的,这对文件格式要有非常严格的要求,比如姓名都是2个字,分数不能是100分或低于10分(占用字节数不一样,导致每条记录大小不一样)
  2. struct Stu 的大小包含了一些padding 的大小,大小应该是4+8+4 = 16个字节,所以用文件大小/sizeof(struct Stu)很难得到正确的记录数
  3. 可以通过读文件有多少行来判断有多少个记录,然后对每次读入的一行进行sscanf

具体什麽现象?name数组再大一点吧