请问我的main.c里面的一个输出为什么不对

学生成绩管理系统
studentinit.dat
001 jianyang computer 1 66 65 58
002 richard software 1 99 98 95
003 bachman computer 1 80 60 55
004 monika software 1 90 90 90
005 Jason computer 1 99 99 99
006 huaqiang computer 2 60 50 40
007 koyozi network 2 60 75 88
008 kaguna network 2 70 70 77
009 tim software 2 90 90 98
010 trump network 2 99 99 95

student.h

#define N 10
struct student{
    char num [15];
    char name[15];
    char major[10];//compoter software network
    int classno;//1~2
    int score[3];
};
typedef struct student STU;

main.c

#include <stdio.h>
#include"student.h"
#include<string.h>
#include<stdlib.h>
FILE *fp=NULL;

int main()
{   
    
    fp=fopen("studentInit.dat","r+");
    if(fp==NULL){
        printf("cannot open file");
        fclose(fp);
        return 0;
    }

    printf("请输入功能编号,运行相应功能\n1.从文件中读入10个学生信息\n2.从文件中随机读取第n个(0<n<=9)学生的信息\n");
    printf("3.输入班级与成绩要求进行查找\n4.所有学生每门课的最高分和分数最高的学生的姓名\n");
    printf("5.所有学生按平均成绩从低到高进行简单选择排序\n6.对某个班级所有学生按平均成绩由高到低进行起泡排序");
    printf("7.对某个专业的学生按某门课程成绩由低到高进行直接插入排序\n8.存储更新后的学生信息\n");

    STU x[N];
    for(int i=0;i<N;i++){
        while(!feof(fp)){
            fscanf(fp,"%s %s %s %d %d %d %d",x[i].num,x[i].name,x[i].major,&x[i].classno,
            &x[i].score[0],&x[i].score[1],&x[i].score[2]);
          
        }//数据已扫描到结构体数组x[N] 
        
    }
    printf("%d\n",x[1].score[0]);
    /*printf("%s %s %s %d %d %d %d",x[2].num,x[2].name,x[2].major,x[2].classno,
            x[2].score[0],x[2].score[1],x[2].score[2]);*/
    //Output(x+2);
    return (0);
}
void Input(STU *p,int n){
    
    fclose(fp);

    fp=fopen("studentInit.dat","w");
    
    for(int i=0;i<n;i++){
        printf("输入第%d个学生的信息",(i+1));
        scanf("%s %s %s %d %d %d %d",(p+i)->num,(p+i)->name,(p+i)->major,&p[i].classno,
        (p+i)->score[0],(p+i)->score[1],(p+i)->score[2]);
    }
    for(int i=0;i<N;i++){
        
        fputs((p+i)->num,fp);
        fputc(' ',fp);
        fputs((p+i)->name,fp);
        fputc(' ',fp);
        fputs((p+i)->major,fp);
        fputc(' ',fp);
        putw(p[i].classno,fp);
        fputc(' ',fp);
        putw((p+i)->score[0],fp);
        fputc(' ',fp);
        putw((p+i)->score[1],fp);
        fputc(' ',fp);
        putw((p+i)->score[2],fp);
        fputc('\n',fp);
    }
};
void formout(char *c,int length){
        for(int i=0;i<length;i++){
            if(c[i]!='\0'){
                printf("%c",c[i]);
            }
            else{
                printf(" ");
            }
        }
    };
void Output(STU *p){
    formout(p->num,15);
    formout(p->name,15);
    formout(p->major,10);
    printf(" %d",p->classno);
    printf(" %d %d %d",p->score[0],p->score[1],p->score[2]);

};
STU Fetch(int studentIndex){
    puts("按学号(1)还是按姓名(2)查找");
};
void Search(STU *p,int classNO,char s,int scoreSum);
int Max(STU *p, int scoreIndex);


打个断点调试一下

主函数里修改见注释,供参考:

int main()
{

    fp = fopen("studentInit.dat", "r+");
    if (fp == NULL) {
        printf("cannot open file");
        //fclose(fp); 这行多余,如果文件打开不成功,不需要关闭文件  修改
        return 0;
    }

    printf("请输入功能编号,运行相应功能\n1.从文件中读入10个学生信息\n2.从文件中随机读取第n个(0<n<=9)学生的信息\n");
    printf("3.输入班级与成绩要求进行查找\n4.所有学生每门课的最高分和分数最高的学生的姓名\n");
    printf("5.所有学生按平均成绩从低到高进行简单选择排序\n6.对某个班级所有学生按平均成绩由高到低进行起泡排序");
    printf("7.对某个专业的学生按某门课程成绩由低到高进行直接插入排序\n8.存储更新后的学生信息\n");

    STU x[N];
    int i = 0;   //修改
    //for (int i = 0; i < N; i++) {   修改
        while (!feof(fp)) {
            fscanf(fp, "%s %s %s %d %d %d %d", x[i].num, x[i].name, x[i].major, &x[i].classno,
                &x[i].score[0], &x[i].score[1], &x[i].score[2]);
            i++;

        }//数据已扫描到结构体数组x[N] 

    //}   修改
    printf("%d\n", x[1].score[0]);
    /*printf("%s %s %s %d %d %d %d",x[2].num,x[2].name,x[2].major,x[2].classno,
            x[2].score[0],x[2].score[1],x[2].score[2]);*/
            //Output(x+2);
    return (0);
}