关于c语言的文件操作

票务预订业务
票务预订业务是指学生订票(等同于买票),采用实名制。预订信息包括日期、时间、学号、姓名、班级。每人每场只能预订1张票。将信息存入文件“book.dat”中。文件“book.dat”中包括所有场次活动的预定情况。
有学生预订票时,先输入他提出的日期及时间,查询票务信息(文件“number.dat”)。若有余票,则为学生办理订票手续。此时输入他的学号、姓名,按所要求的日期、时间分配给他具有相应排、号的座位,然后将该学生的预订信息添加到文件“book.dat”中,并修改文件“number.dat”中该场活动的预订量和剩余量。若无余票,则输出“无余票”信息,可以重新预订。
若学生订票成功,则应出具票据。根据学生具体预订情况,生成相应票据。每张票据内容见“4)票据生成”。

以上是写该函数的要求,请问我的代码有什么问题呢?

struct billData
{
    int year;//年 
    int month;//月 
    int day;//日 
    int week;//星期 
    int hour;//时 
    int minute;//分 
    int pai;//排 
    int hao;//号 
    char type[10];//类型 
    float price;//票价 
    int bianhao;//编号
    int sum;//总量 
    int reserve;//预定量 
    int surplus;//剩余量 
    int num;//学号 
    char name[10];//姓名 
    int classn;//班级 
};
void reservation()//票务预订业务 
{//年,月,日,时,分,学号,姓名,班级 
//先从number里面通过日期和时间查询,有余票办理,输入学号姓名班级,按日期时间分配排,号,再将预订信息添加到book里面 
    FILE *fptr,*fptr1;//分别指向number和 book
    struct billData bill={2021,1,1,1,0,0,1,1,"",0.0,1,0,0,0,0,"",0};
    int nian,yue,ri,shi,fen;
    int i;
    int flag=0;
    int panduan=0;
    int judge=0;
    int xuanze=0;
    int sheng;//保存买票之后实际的剩余量
    int yu;//保存买票之后实际的的预定量
    int xuehao,banji;
    char xingming[10];
    
    printf("请输入您要预订的日期(年,月,日):");
    scanf("%d%d%d",&nian,&yue,&ri);
    printf("请输入您要预订的时间(时,分):");
    scanf("%d%d",&shi,&fen); 
    if((fptr=fopen("number.dat","rb+"))==NULL)
    {
           printf("不能打开文件\n");
           exit(0);
    }
    if((fptr1=fopen("book.dat","ab+"))==NULL)
       {
           printf("不能打开文件\n");
           exit(0);
       }
    
//先在number里进行查找 
        while ((fread(&bill,sizeof(struct billData),1,fptr))!=0)
        {
          if(nian==bill.year && yue==bill.month && ri==bill.day && shi==bill.hour && fen==bill.minute && bill.surplus!=0)//是要查找的信息 
          {
            printf("您预订的时间有余票!"); 
            printf("相关票务信息如下:\n");
            if(flag==0)//第一次的数据需要输出标题 
            {
               printf("%s%16s%8s%10s%7s%8s%7s\n","日期","星期","时间","总量","预定量","剩余量","票价");
            } 
            printf("%d年%02d月%02d日   %d      %02d时%02d分   %d   %d      %d       %.2f\n",bill.year,bill.month,bill.day,bill.week,bill.hour,bill.minute,bill.sum,bill.reserve,bill.surplus,bill.price);
            flag=1;
            //panduan=0;//此账号信息能保存 
          }
        }
        if(flag==0)
        {
           printf("无余票!\n");    
        } 
        //fclose(fptr);
        //查着了,输入学号姓名班级,存入book 
       //预订信息包括日期、时间、学号、姓名、班级。
       
       while(1) 
       {
            printf("请输入您的具体信息(学号,姓名,班级):\n");
         scanf("%d%s%d",&xuehao,xingming,&banji);
         rewind(fptr1);
         panduan=0;
         while((fread(&bill,sizeof(struct billData),1,fptr1))!=0)
         {
             if(xuehao==0)
            { 
              printf("输入学号不能为零\n");
              panduan=1;  //说明此账号不能保存 
              break;
            }
            if(xuehao==bill.num)
            { 
              printf("输入学号不能重复\n");
              panduan=1;  //说明此账号不能保存 
              break;
            }
         }
         if(panduan==0) //说明此账号可以保存 
         {
            bill.num=xuehao;//通过赋值往book里面存入信息 
            strcpy(bill.name,xingming);
            bill.classn=banji;
            bill.year=nian;
            bill.month=yue;
            bill.day=ri;
            bill.hour=shi;
            bill.minute=fen;
            fseek(fptr1,0,SEEK_END);
            fwrite(&bill,sizeof(struct billData),1,fptr1);
            printf("保存信息成功\n");
            printf("%s%16s%8s%10s%7s%8s%7s%6s%6s%6s%6s\n","日期","时间","学号","姓名","班级");
            printf("%d年%02d月%02d日         %d时%02d分       %d     %s     %d\n",bill.year,bill.month,bill.day,bill.hour,bill.minute,bill.num,bill.name,bill.classn);
            continue; 
         } 
         printf("是否输入继续录入信息:是:1;否:非1;请选择:");
         scanf("%d",&xuanze);
         if(xuanze!=1) 
         {
          break;    
         } 
       }
       
       i=0;
        while ((fread(&bill,sizeof(struct billData),1,fptr))!=0)//修改number 
       {
           if(nian==bill.year && yue==bill.month && ri==bill.day && shi==bill.hour && fen==bill.minute)
           {
               bill.surplus--;
            bill.reserve++;
            bill.bianhao++;
            bill.hao++;
            if(bill.hao==11)
            {
              bill.pai++;
              bill.hao=1;
            }
            fseek(fptr,i*sizeof(struct billData),SEEK_SET);
            fwrite(&bill,sizeof(struct billData),1,fptr);
            judge=1;
            break;
        }
            i++;
        }
       if(judge==0)
       {
        printf("修改信息失败!\n"); 
       }
       fclose(fptr);
       fclose(fptr1);
    
    
}


代码是运行有问题?
拿文件作为程序运行过程中的存储,会导致大量的磁盘I/O,效率很低,应该在内存中记录一份数据,开始的时候从文件读入,过程中只需要修改内存数据,结束的时候再将内存写入文件就行了

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^