c语言学生学籍管理系统无法录入信息

要求:用文件保存,对学生学籍进行注册,修改,查找,统计,学籍变化
1,以菜单方式工作
2,登记学生的学号,姓名,性别,年龄,籍贯,学院,专业,班级
3,修改已知学号的学业信息
4,查找已知学号的学生信息
5,按学号和专业输出学生籍贯表
6,查询学生学籍变化,如:入学,转专业,退学,降级,休学,毕业

我的编译显示没有出错,但是录入不了的信息,急需帮助(今天之内


#include<stdlib.h>
#include<string.h>
#include <conio.h>
#define MAX 100
struct student
{
    short status;        /*数据状态,0:正常 1:删除*/
    int num;            /*学生的学号*/
    char name[9];        /*姓名*/
    char sex[3];        /*性别*/
    int age;            /*年龄*/
    char origin[21];    /*籍贯*/
    char depart[21];    /*学院*/
    char major[21];    /*专业*/
    int clas[20];            /*班级*/
char change[30];  /*学籍*/
};

/*子函数部分*/
void add_data();        /*登记数据*/
void update_data();    /*修改数据*/
void search_data();    /*查询数据*/
void list_data();        /*学籍表数据*/
void change_data();   /*查询学籍数据*/


/*主函数*/
FILE *fp;
main()
{
    int select;        /*选择变量*/
    if((fp=fopen("stu.dat","rb+"))==NULL)        /*stu.dat文件不存在*/
    {
        if((fp=fopen("stu.dat","wb+"))==NULL)    /*打开stu.dat文件失败*/
        {
            printf("打开文件stu.dat失败!");
            system("PAUSE");        /*暂时停一下,等待下一个操作*/
            exit(1);                /*退出程序*/
        }
    }
do
{
    printf(" \n\n                                                       \n\n");
    printf("************************************************************\n\n");
    printf("  *                   学生信息管理系统                  *  \n \n");
    printf("------------------------------------------------------------\n\n");
    printf("********************系 统 功 能 菜 单*************************\n");
    printf("--------------------------------------------------------------\n");
    printf("                                                              \n");
    printf("*******                1.登记学生信息                  *******\n");
    printf("--------------------------------------------------------------\n");
    printf("*******                2.修改学生信息                  *******\n");
    printf("--------------------------------------------------------------\n");
    printf("*******                3.查询学生信息                  *******\n");
    printf("--------------------------------------------------------------\n");
    printf("*******                4.学生籍贯表                     ******\n");
    printf("--------------------------------------------------------------\n");
    printf("*******                5.查询学生学籍变化              *******\n");
    printf("--------------------------------------------------------------\n");
    printf("*******                6.退出系统                      *******\n");
    printf("**************************************************************\n");
    printf("--------------------------------------------------------------\n");
     printf("\n请选择:\n");
    scanf("%d",&select);
    while(select<1||select>6)
    {
        printf("请输入1至6的数:");
        scanf("%d",&select);
    }
    switch(select)
    {
    case 1:
        add_data();        /*增加数据*/
break; 
    case 2:
        update_data();        /*更新数据*/
break; 
    case 3:
        search_data();        /*查询数据*/
break;
    case 4:
        list_data();        /*显示数据*/
break; 
    case 5:
        change_data();       /*查询学籍数据*/
break;    
}
}while(select!=6);            /*选择6退出循环*/
fclose(fp);                /*关闭文件*/
system("PAUSE");            /*暂时停一下,等待下一个操作*/
}

/*登记数据函数*/
void add_data()
{
    struct student stu;        /*定义学生变量stu*/
    char tag;                    /*设置标志是否继续添加数据*/
    stu.status=0;                /*数据状态,0:正常 1:删除*/
    do
    {
        printf("学号:");
        scanf("%d",&stu.num);
        printf("姓名:");
        scanf("%s",stu.name);
        printf("性别:");
        scanf("%s",stu.sex);
        printf("年龄:");
        scanf("%d",&stu.age);
        printf("籍贯:");
        scanf("%s",stu.origin);
        printf("学院:");
        scanf("%s",stu.depart);
        printf("专业:");
        scanf("%s",stu.major);
        printf("班级:");
        scanf("%d",&stu.clas);
        printf("学籍变化:");
        scanf("%s",stu.change);  
        fseek(fp,0,SEEK_END);            /*将指针移动到文件尾部*/
/*将学生信息存入文件中*/
        fwrite(&stu,sizeof(struct student),1,fp); 
        printf("继续添加吗(y/n):");
        while (getchar()!='\n');        /*跳过当前行*/
        tag=getchar();                /*将大写字母转化为小写字母*/
        while(tag!='y'&&tag!='n')
        {
            printf("输入非法,从新输入(y/n):");
            while(getchar()!='\n');    /*跳过当前行*/
            tag=getchar();            /*将大写字母转化为小写字母*/
         }
      }while(tag=='y');                /*当回答要求循环时*/
}

/*修改数据函数*/
void update_data()
{
    struct student stu;        /*学生*/
    int num;                    /*要修改的学生的学号*/
    printf("输入要修改的学生的学号:");
    scanf("%d",&num);
    rewind(fp);                /*使位置指针返回到文件的开头*/
    fread(&stu,sizeof(struct student),1,fp);    /*读入学生信息*/
    while(!feof(fp))
    {
/*文件未结束*/
/*查找学号相同且数据状态正常未作删除标记*/
        if(stu.num==num&&stu.status==0) 
            break;
        fread (&stu,sizeof(struct student),1,fp);/*继续读取学生信息*/
    }
    if(!feof(fp))
    {
/*查询成功*/
        printf("更新前学生的信息:\n");
         printf("\n学生的信息如下:\n");

      printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%10s\n",
            "学号","姓名","性别","年龄","籍贯","学院","专业","班级","学籍");
        printf("%-10s%-10s%10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
            stu.num,stu.name,stu.sex,stu.age,stu.origin,
            stu.depart,stu.major,stu.clas,stu.change);

        printf("输入更新后的数据:\n");
        printf("1—学号:");
        scanf("%d",&stu.num);
        printf("2—姓名:");
        scanf("%s",stu.name);
        printf("3—性别:");
        scanf("%s",stu.sex);
        printf("4—年龄:");
        scanf("%d",&stu.age);
        printf("5—籍贯:");
        scanf("%s",stu.origin);
        printf("6—学院:");
        scanf("%s",stu.depart);
        printf("7—专业:");
        scanf("%d",stu.major);
        printf("8—班级:");
        scanf("%d",&stu.clas);
        printf("9—学籍变化:");
        scanf("%s",stu.change);
/*将指针从当前位置移动到一个学生信息之前*/
        fseek(fp,sizeof(struct student),1); 
        fwrite(&stu,sizeof(struct student),1,fp);    /*写入数据*/
    }
    else
    {
/*查询失败*/
        printf("无此学号的学生!\n");
        clearerr(fp);        /*清除文件结束标志*/
    }
}

/*查询数据函数*/
void search_data()
{
    struct student stu;        /*学生*/
    int num;                    /*学生的学号*/
    printf("输入要查询的学生的学号:");
    scanf("%d",&num);
    rewind(fp);
    fread(&stu,sizeof(struct student),1,fp);    /*读入学生信息*/
    while(!feof(fp))
    {
/*文件未结束*/
/*学生的学号相同且数据正常,未作删除标记*/
        if(stu.num==num&&stu.status==0)             /*查询成功*/
            break; 
        fread(&stu,sizeof(struct student),1,fp);/*读入学生信息*/
    }
    if(!feof(fp))
    {
/*查询成功*/
        printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%10s\n",
            "学号","姓名","性别","年龄","籍贯","学院","专业","班级","学籍变化");
        printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n",
            stu.num,stu.name,stu.sex,stu.age,stu.origin,
            stu.depart,stu.major,stu.clas,stu.change);
    }
    else
    {
/*查询失败*/
        printf("无此学号的学生:");
        clearerr(fp);
    }
}

/*学籍表数据函数*/
void list_data()
{
    struct student stu[MAX],tstudent;
    int select;        /*选择变量*/
    int stcout=0,n;    /*stcout表示学生的个数*/
    int i,j;
    printf("请选择:\n");
    printf("1.按学号显示  2.按专业显示\n");
    scanf("%d",&select);
    while(select<1||select>3)
    {
        printf("请输入1或2的数:");
        scanf("%d",&select);
    }
    rewind(fp);        /*使位置指针返回到文件的开头*/
    fread(&stu[0],sizeof(struct student),1,fp);        /*读入学生信息*/
    while(!feof(fp))
    {
/*计算文件中学生信息的学生数*/
        stcout++;
/*继续读入学生信息*/
        fread(&stu[stcout],sizeof(struct student),1,fp);
    }
    if(select==1)
    {
/*用冒泡排序法把学生信息按学号大小排序*/
        for(i=1;i<=stcout;i++)
            for(j=0;j<stcout-i;j++)
            {
                if(stu[j].num>stu[j+1].num)
                {
                    tstudent=stu[j];
                    stu[j]=stu[j+1];
                    stu[j+1]=tstudent;
                }
            }
            printf("按学生的学号排序:\n");
            printf("%-10s%-10s%10s\n",
            "学号","姓名","籍贯");
            for(i=0;i<stcout;i++)        /*按学号顺序输出学生信息*/
            {
                if(stu[i].status==0)    /*数据状态正常,未作删除标志*/
                {
                    printf("%-10s%-10s%-10s%\n",
                    stu[i].num,stu[i].name,stu[i].origin);
                }
            }
    }
    else
    {
/*用冒泡排序法把学生信息按专业排序*/
        for(i=0;i<stcout;i++)
            for(j=0;j<stcout-i;j++)
            {
                if(strcmp(stu[j].major,stu[j+1].major)>0)
                {
                    tstudent=stu[j];
                    stu[j]=stu[j+1];
                    stu[j+1]=tstudent;
                }
            }
            printf("按专业排序:\n");
            printf("%-10s%-10s%10s%\n",
            "学号","姓名","籍贯");
            for(i=0;i<stcout;i++)        /*按专业顺序输出学生信息*/
            {
                if(stu[i].status==0)
                {
                    printf("%-10d%-10s%-10s%\n",
                    stu[i].num,stu[i].name,stu[i].origin);
                }
            }
    }
    clearerr(fp);        /*清除文件结束标记*/
}
/*学籍查询数据函数*/
void change_data()
{
    struct student stu;        /*学生*/
    int num;                    /*学生的学号*/
    printf("输入要查询的学生的学号:");
    scanf("%d",&num);
    rewind(fp);        /*使位置指针返回到文件的开头*/
    fread(&stu,sizeof(stu.change),1,fp);    /*读入学生信息*/
    while(!feof(fp))
    {
/*文件未结束*/
/*学生的学号相同且数据正常,未作删除标记*/
        if(stu.num==num&&stu.status==0)             /*查询成功*/
            break; 
        fread(&stu,sizeof(stu.change),1,fp);/*读入学生信息*/
    }
    if(!feof(fp))
    {
/*查询成功*/
printf("\n%d的学籍情况如下:\n",stu.num);
        printf("%-10s\n","学籍变化");
       
    }
    else
    {
/*查询失败*/
        printf("无此学号的学生:");
        clearerr(fp);
    }
}