m0_62667564 2022-03-27 13:00 采纳率: 84.8%
浏览 93
已结题

C语言二进制文件的读写

结构体的班级学生管理:加入班级学生信息文件的读写功能。采用二进制方式读写文件
分为当前目录中是否存在文件名为计算机1班的两种情况,如果不存在,就创建该文件;如果存在,就直接读入。但都要首先读入(输入写入)学生的人数,再读入(输入写入)其它信息。
下面是我写的代码
#include<stdio.h>
#include<malloc.h>
typedef struct student
{
int number;
char name[20];
union
{
unsigned int all:25;
struct
{
unsigned int year:16;
unsigned int month:4;
unsigned int day:5;
}d1;
}date;
enum sex
{
boy=1,girl=2
}var;
float score[4];
double sum;
double average;
}STU;
void main()
{
STU st[20];
STUstudents=NULL;
FILE
p;
int n,i,j;
p=fopen("d:\计算机1班.dat","rb");
if(p==NULL)
{
p=fopen("d:\计算机1班.dat","wb");
printf("输入学生数量:");
scanf("%d",&n);//先输入人数
students=(STU*)calloc(n,sizeof(STU));//据此分配内存空间
for(i=0;i<n;i++)//逐个录入学生信息
{
printf("输入第%d个同学的学号 姓名 出生日期(8位连续输入,只有个位用零补齐) 性别(男生输1,女生输2):",i+1);
scanf("%d%s%d%d",&st[i].number,st[i].name,&st[i].date,&st[i].var);
for(j=0;j<4;j++)
{
printf("输入第%d个同学第%d科成绩:",i+1,j+1);
scanf("%f",&st[i].score[j]);
}
}
fwrite(&n,4,1,p);//首先将人数写入到班级文件中,1个int,4个字节
fwrite(st,sizeof(STU),n,p);//再将所有学生的信息写入到文件中
}
else if(p!=NULL)
{
//首先读入学生人数(1个int)

    //据此动态分配学生结构体数组
    //然后从文件剩余部分读入所以学生信息
}
//最后释放动态分配的内存

}
在输入第一个同学的第一个成绩后程序就会出现错误中止,为什么呢?
还有如果文件存在,首先读入学生人数的功能是怎么实现的?然后又是怎么动态分配内存?从剩余部分继续读入学生信息的?实在不明白,麻烦在我的基础上修改和补充,但定义的结构体不要变,多谢了

  • 写回答

3条回答 默认 最新

  • 关注

    你代码里在结构体里套用了共用体,
    scanf("%d%s%d%d",&st[i].number,st[i].name,&st[i].date,&st[i].var);这句话中,
    scanf读取数据的时候,data是结构体,%d读取结构体的数据是不对的。应该指明读取的数据。
    代码修改如下:

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    typedef struct student
    {
        int number;
        char name[20];
        union
        {
            unsigned int all:25;
            struct
            {
                unsigned int year:16;
                unsigned int month:4;
                unsigned int day:5;
            }d1;
        }date;
        enum sex
        {
            boy=1,girl=2
        }var;
        float score[4];
        double sum;
        double average;
    }STU;
    void main()
    {
        //STU st[20]; //这个用不到
        STU* students=NULL;
        FILE *p;
        int n,i,j;
    
        int tnmb;
        char tname[20];
        unsigned int tall;
        int tenum;
    
    
        p=fopen("d:\\计算机1班.dat","rb");
        if(p==NULL)
        {
            p=fopen("d:\\计算机1班.dat","wb");
            printf("输入学生数量:");
            scanf("%d",&n);//先输入人数
            students=(STU*)malloc(n*sizeof(STU));//据此分配内存空间
            for(i=0;i<n;i++)//逐个录入学生信息
            {
                printf("输入第%d个同学的学号 姓名 出生日期(8位连续输入,只有个位用零补齐) 性别(男生输1,女生输2):",i+1);
                scanf("%d%s%d%d",&tnmb,tname,&tall,&tenum);
                students[i].number = tnmb;
                strcpy(students[i].name,tname);
                students[i].date.all = tall;
                if(tenum == 1)
                    students[i].var = STU::boy;
                else
                    students[i].var = STU::girl;
                //scanf("%d%s%d",&(students[i].number),students[i].name,&(students[i].date.all));//&(students[i].var));
                students[i].sum = 0;
                for(j=0;j<4;j++)
                {
                    printf("输入第%d个同学第%d科成绩:",i+1,j+1);
                    scanf("%f",&students[i].score[j]);
                    students[i].sum += students[i].score[j];
                }
                students[i].average = students[i].sum/4;
            }
            fwrite(&n,4,1,p);//首先将人数写入到班级文件中,1个int,4个字节
            fwrite(students,sizeof(STU),n,p);//再将所有学生的信息写入到文件中
            fclose(p); //这里关闭文件
        }
        else if(p!=NULL)
        {
            //首先读入学生人数(1个int)    
            fread(&n,4,1,p);//读取n
            //据此动态分配学生结构体数组
            //然后从文件剩余部分读入所以学生信息
            students=(STU*)malloc(n*sizeof(STU));//据此分配内存空间
            for(i=0;i<n;i++)
            {
                fread(&students[i],sizeof(STU),1,p);
                //显示读取的内容:测试用
                printf("%d %s %d %d\n",students[i].number,students[i].name,students[i].date.all,students[i].var);
            }
            fclose(p);
        }
        //最后释放动态分配的内存
        if(students)
        {
            free(students);
            students = 0;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂