结构体文件的存入输出

样例
20221001 奕星 男 2001 1 2 99 98 88
20223267 吕布 男 2001 6 28 36 56 75
20223564 貂蝉 女 2002 5 8 64 68 69
20223698 公孙离 女 2002 4 13 99 64 58
20223147 亚瑟 男 2001 5 6 85 88 23
20222456 孙策 男 2002 12 6 68 66 99
20226874 蒙恬 男 2001 7 18 76 77 78
20229874 花木兰 女 2003 2 12 88 66 77
20224567 米莱狄 女 2003 7 16 81 74 66
20223174 狂铁 男 2002 4 6 45 65 77

想问问怎么能改正确,最下面两个文件函数。


#include
#include
struct student
{
    int num;
    char name[21],sex[5];
    int data[3];
    float grade[3];
    float ave,s;
    int mingci,year,month,day;
};
void shuru(struct student stu[]);
void shuchu(struct student stu[]);
void jisuan(struct student stu[]);
void average(struct student stu[]);
void maxfen(struct student stu[]);
void shuchuu(struct student stu[],int i);
void cunru(struct student stu[]);
void tiqu(struct student stu[]);
int main()
{
    struct student stu[10];
    printf("\t\t|﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌STUDENTS﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌|\n");
    printf("\t\t|\t1.输入学生的基本信息和三门成绩\t\t       |\n");
    printf("\t\t|\t2.输出学生的基本信息和三门成绩\t\t       |\n");
    printf("\t\t|\t3.求出每个学生三门课程的平均分\t\t       |\n");
    printf("\t\t|\t4.对十名学和按照平均分进行排队\t\t       |\n");
    printf("\t\t|\t5.输出每门课程成绩最高的同学的基本信息 \t       |\n");
    printf("\t\t|\t6.将数据保存到文件\t\t\t       |\n");
    printf("\t\t|\t7.将数据从文件读出\t\t\t       |\n");
    printf("\t\t|\t8.输入零退出此程序\t\t\t       |\n");
    printf("\t\t|﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌|\n");

    int m;
    do
    {
        printf("请输入一个选项:");
        scanf("%d",&m);
        switch(m)
        {
            case 1:printf("请输入学生数据:\n"); shuru(stu); printf("输入成功\n");break;
            case 2:shuchu(stu);  break;
            case 3:jisuan(stu);  break;
            case 4:average(stu); break;
            case 5:maxfen(stu);  break;
            case 6:cunru(stu);  break;
            case 7:tiqu(stu);  break;
            case 0:break;
            default:break;
        }
    }while(m!=0);
    printf("你已成功退出程序");
    return 0;
}
void shuru(struct student stu[])
{
    int i,j;
    for(i=0;i<10;i++)
    {
        stu[i].s=0;
        scanf("%d%s%s",&stu[i].num,&stu[i].name,&stu[i].sex);
        scanf("%d%d%d",&stu[i].year,&stu[i].month,&stu[i].day);
        for(j=0;j<3;j++)
        {
            scanf("%f",&stu[i].grade[j]);
            stu[i].s+=stu[i].grade[j];
        }
        stu[i].ave=0;
        stu[i].mingci=0;
    }

}
void shuchu(struct student stu[])
{
    printf("全部学生的基本信息为:\n");
    int i,j;
    printf("学号\t   姓名        性别    出生日期   C语言 高数  线代   总分  平均分 排名\n");
    for(i=0;i<10;i++)
    {
        printf("%8d   %-8s   %3s  ",stu[i].num,stu[i].name,stu[i].sex);
        printf("%4d年%2d月%2d日 ",stu[i].year,stu[i].month,stu[i].day);
        for(j=0;j<3;j++)
        {
            printf("%5.2f ",stu[i].grade[j]);
        }
        printf("%3.2f ",stu[i].s);
        printf("%5.2f %3d\n",stu[i].ave,stu[i].mingci);

    }

}
void jisuan(struct student stu[])
{
    for(int i=0;i<10;i++)
    stu[i].ave=stu[i].s/3;
    printf("已完成平均分计算\n");
}
void average(struct student stu[])
{
    int i,j;
    for(i=0;i<9;i++)
        for(j=0;j<9-i;j++)
        if(stu[j].ave<stu[j+1].ave)
        {
            struct student ch=stu[j];
            stu[j]=stu[j+1];
            stu[j+1]=ch;
        }
    for(i=0;i<10;i++)
    {
        stu[i].mingci=i+1;
    }
    printf("已完成平均分排序\n");
}
void maxfen(struct student stu[])
{
    printf("三科最高分分别为:\n");
    printf("学号\t   姓名        性别    出生日期   C语言 高数  线代   总分  平均分 排名\n");
    int i,j;float max;char ke[3][20]={"C语言","高数","线代"};
    for(j=0;j<3;j++)
    {
        max=0;
        for(i=0;i<10;i++)
            if(stu[i].grade[j]>max)
            {
                max=stu[i].grade[j];
            }
    printf("%s成绩最高的为:\n",ke[j]);
    for(int l=0;l<10;l++)
    if(stu[l].grade[j]==max)
    shuchuu(stu,l);
}
    }

void shuchuu(struct student stu[],int i)
{
    int j;
    {
        printf("%8d   %-8s   %3s  ",stu[i].num,stu[i].name,stu[i].sex);
        printf("%4d年%2d月%2d日 ",stu[i].year,stu[i].month,stu[i].day);
        for(j=0;j<3;j++)
        {
            printf("%5.2f ",stu[i].grade[j]);
        }
        printf("%3.2f ",stu[i].s);
        printf("%5.2f %3d\n",stu[i].ave,stu[i].mingci);

    }
}
void cunru(struct student stu[])
{
    FILE *fp; int i;
    fp=fopen("D:\STDU","w");
    if(fp==NULL)
    {
        printf("没有该文件\n");
        exit(0);
    }
    for(i=0;i<10;i++)
        fwrite(&stu[i],sizeof(struct student),10,fp);
    fclose(fp);
    printf("已成功输入文件\n");
}
void tiqu(struct student stu[])
{
    FILE *fp; int i;
    fp=fopen("D:\STDU","r");
    if(fp==NULL)
    {
        printf("没有该文件\n");
        exit(0);
    }
    for(i=0;i<10;i++)
        fread(&stu[i],sizeof(struct student),10,fp);
    fclose(fp);
    printf("已成功读取文件\n");
}

简单修改了下,就是把这两个函数里的fread()换为fscanf(),把fwrite()换为fprintf(),初步测试可以正常存入和读取文件中的信息了(平均分,总分和排名因为还没有计算,所以数据是随机的),修改如下:

 
#include<stdio.h>
#include <stdlib.h> 
#include<string.h>
struct student
{
    int num;
    char name[21],sex[5];
    int data[3];
    float grade[3];
    float ave,s;
    int mingci,year,month,day;
};
void shuru(struct student stu[]);
void shuchu(struct student stu[]);
void jisuan(struct student stu[]);
void average(struct student stu[]);
void maxfen(struct student stu[]);
void shuchuu(struct student stu[],int i);
void cunru(struct student stu[]);
void tiqu(struct student stu[]);
int main()
{
    struct student stu[10];
    printf("\t\t|﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌STUDENTS﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌|\n");
    printf("\t\t|\t1.输入学生的基本信息和三门成绩\t\t       |\n");
    printf("\t\t|\t2.输出学生的基本信息和三门成绩\t\t       |\n");
    printf("\t\t|\t3.求出每个学生三门课程的平均分\t\t       |\n");
    printf("\t\t|\t4.对十名学和按照平均分进行排队\t\t       |\n");
    printf("\t\t|\t5.输出每门课程成绩最高的同学的基本信息 \t       |\n");
    printf("\t\t|\t6.将数据保存到文件\t\t\t       |\n");
    printf("\t\t|\t7.将数据从文件读出\t\t\t       |\n");
    printf("\t\t|\t8.输入零退出此程序\t\t\t       |\n");
    printf("\t\t|﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌|\n");
    int m;
    do
    {
        printf("请输入一个选项:");
        scanf("%d",&m);
        switch(m)
        {
            case 1:printf("请输入学生数据:\n"); shuru(stu); printf("输入成功\n");break;
            case 2:shuchu(stu);  break;
            case 3:jisuan(stu);  break;
            case 4:average(stu); break;
            case 5:maxfen(stu);  break;
            case 6:cunru(stu);  break;
            case 7:tiqu(stu);  break;
            case 0:break;
            default:break;
        }
    }while(m!=0);
    printf("你已成功退出程序");
    return 0;
}

void cunru(struct student stu[])
{
    FILE *fp; int i;
    fp=fopen("D:\STDU","w");
    if(fp==NULL)
    {
        printf("没有该文件\n");
        exit(0);
    }
    
        for(i=0;i<10;i++){
          
           // fwrite(&stu[i],sizeof(struct student),10,fp);
         fprintf(fp,"%d %s %s %d %d %d %f %f %f\n",stu[i].num,stu[i].name,stu[i].sex,
         stu[i].year,stu[i].month,stu[i].day,
         stu[i].grade[0],stu[i].grade[1],stu[i].grade[2]) ;
    }
    
      
    fclose(fp);
    printf("已成功输入文件\n");
}

void tiqu(struct student stu[])
{
    FILE *fp; int i;
    fp=fopen("D:\STDU","r");
    if(fp==NULL)
    {
        printf("没有该文件\n");
        exit(0);
    }
    for(i=0;i<10;i++){
          //fread(&stu[i],sizeof(struct student),10,fp);
         fscanf(fp,"%d%s%s%d%d%d%f%f%f\n",&stu[i].num,stu[i].name,stu[i].sex,
         &stu[i].year,&stu[i].month,&stu[i].day,
         &stu[i].grade[0],&stu[i].grade[1],&stu[i].grade[2]) ;
    }
      
    fclose(fp);
    printf("已成功读取文件\n");
}

void shuru(struct student stu[])
{
    int i,j;
    for(i=0;i<10;i++)
    {
        stu[i].s=0;
        scanf("%d%s%s",&stu[i].num,stu[i].name,stu[i].sex);
        scanf("%d%d%d",&stu[i].year,&stu[i].month,&stu[i].day);
        for(j=0;j<3;j++)
        {
            scanf("%f",&stu[i].grade[j]);
            stu[i].s+=stu[i].grade[j];
        }
        stu[i].ave=0;
        stu[i].mingci=0;
    }
}
void shuchu(struct student stu[])
{
    printf("全部学生的基本信息为:\n");
    int i,j;
    printf("学号\t   姓名        性别    出生日期   C语言 高数  线代   总分  平均分 排名\n");
    for(i=0;i<10;i++)
    {
        printf("%8d   %-8s   %3s  ",stu[i].num,stu[i].name,stu[i].sex);
        printf("%4d年%2d月%2d日 ",stu[i].year,stu[i].month,stu[i].day);
        for(j=0;j<3;j++)
        {
            printf("%5.2f ",stu[i].grade[j]);
        }
        printf("%3.2f ",stu[i].s);
        printf("%5.2f %3d\n",stu[i].ave,stu[i].mingci);
    }
}
void jisuan(struct student stu[])
{
    for(int i=0;i<10;i++)
    stu[i].ave=stu[i].s/3;
    printf("已完成平均分计算\n");
}
void average(struct student stu[])
{
    int i,j;
    for(i=0;i<9;i++)
        for(j=0;j<9-i;j++)
        if(stu[j].ave<stu[j+1].ave)
        {
            struct student ch=stu[j];
            stu[j]=stu[j+1];
            stu[j+1]=ch;
        }
    for(i=0;i<10;i++)
    {
        stu[i].mingci=i+1;
    }
    printf("已完成平均分排序\n");
}
void maxfen(struct student stu[])
{
    printf("三科最高分分别为:\n");
    printf("学号\t   姓名        性别    出生日期   C语言 高数  线代   总分  平均分 排名\n");
    int i,j;float max;char ke[3][20]={"C语言","高数","线代"};
    for(j=0;j<3;j++)
    {
        max=0;
        for(i=0;i<10;i++)
            if(stu[i].grade[j]>max)
            {
                max=stu[i].grade[j];
            }
    printf("%s成绩最高的为:\n",ke[j]);
    for(int l=0;l<10;l++)
    if(stu[l].grade[j]==max)
    shuchuu(stu,l);
}
    }
void shuchuu(struct student stu[],int i)
{
    int j;
    {
        printf("%8d   %-8s   %3s  ",stu[i].num,stu[i].name,stu[i].sex);
        printf("%4d年%2d月%2d日 ",stu[i].year,stu[i].month,stu[i].day);
        for(j=0;j<3;j++)
        {
            printf("%5.2f ",stu[i].grade[j]);
        }
        printf("%3.2f ",stu[i].s);
        printf("%5.2f %3d\n",stu[i].ave,stu[i].mingci);
    }
}

 

img