m0_74128289 2022-12-20 17:45 采纳率: 87.5%
浏览 31
已结题

C语言结构体文件的存入和输出

想问问我的文件保存(cunru)和文件提取函数(tiqu有什么问题,总是一用这两个函数程序就直接结束了,别的函数没有问题,应该如何进行更改,可以使程序正常运行。


```c
#include<stdio.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 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");
}


```

  • 写回答

2条回答 默认 最新

  • 赵4老师 2022-12-20 17:52
    关注

    fp=fopen("D:\STDU","wb");
    fp=fopen("D:\STDU","rb");

    不要把
    fopen("...","...");fscanf,fprintf,fgets,fgetc,fputc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

    fopen("...","...b");fseek,ftell,fread,fwrite,fscanf,fprintf,fgets,fgetc,fputc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
    弄混了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月22日
  • 已采纳回答 1月14日
  • 创建了问题 12月20日

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况