前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >按数据块读写文件存取学生信息

按数据块读写文件存取学生信息

作者头像
小Bob来啦
发布2020-12-15 09:57:06
6330
发布2020-12-15 09:57:06
举报
文章被收录于专栏:用户8057608的专栏

Nobody really cares if you're miserable, so you might as well be happy。没有人真的在意你是不是难过,所以还是欢乐一点吧。

编程要求

本关的编程任务是补全step2/fileBin.c文件中ReadStudInfo函数和SaveResult函数,以实现按数据块使用FILE结构存取学生信息的功能。具体要求如下:

1.ReadStudInfo函数功能:实现从二进制文件中读取学生的基本信息。

2.SaveResult函数功能:实现从二进制格式文件中读取学生的基本信息。

此题实现内容和昨天差不多,但是实现的方式不一样。传送门:

按格式读写文件存取学生信息(含注释)

测试样例

源代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#define COURSE_MAXNUM 5
//声明结构STUDENT
struct student
{
    long studentID;
    char studentName[20];
    char sex[4];
    struct{
        int year;
        int month;
        int day;
    }birthday;
    float score[COURSE_MAXNUM];
    float total;
    float average;
    int rank;
};
typedef struct student STUDENT;
//声明外部函数,函数在其它源文件中实现
extern void ReadStudInfo(const char *fileName, STUDENT stud[]);
extern void SaveResult(const char *fileName, STUDENT stud[],int n,int m);
//声明本文件中的其它函数
void Input(STUDENT *stud, int n,int m);
void Print(STUDENT *stud, int n,int m);
void TotalAndAverage(STUDENT *stud, int n,int m);
void RankByTotal(STUDENT *stud, int n,int m);

void SaveStudInfo(const char *fileName,STUDENT *stud,int n,int m);
void ReadResult(const char *fileName,STUDENT *stud);

int main()
{
    int n,m;    //n用于存放学生人数,m用于存放课程门数。
    STUDENT *stud; //指向存放学生信息的存储块的首地址

    //freopen("Input.txt","r",stdin);
    scanf("%d%d",&n,&m); //输入学生总人数
    // 动态分配存储
    stud = (STUDENT *)malloc(n*sizeof(STUDENT));
    Input(stud,n,m);//输入学生信息
    //将测试输入信息写入二进制文件
    SaveStudInfo("student.dat",stud,n,m);
    free(stud);
    //打开文件student.dat,以二进制文件方式打开用于读
    //从文件中读取学生信息到数组stud中
    stud = (STUDENT *)malloc(n*sizeof(STUDENT));
    ReadStudInfo("student.dat",stud);//在fileBin.c中
    // 计算总分
    TotalAndAverage(stud,n,m);
    // 计算排名
    RankByTotal(stud,n,m);
    //Print(stud,n,m);
    //打开文件result.dat,以二进制文件方式打开用于写
    //将计算出了总分和平均分以及名次的学生信息写入文件
    SaveResult("result.dat",stud,n,m);//在fileBin.c中
    free(stud);

    //打开文件result.dat,以二进制文件方式打开用于读
    //从文件中读取学生信息到数组stud中,用于测试是否与预期输出一致
    stud = (STUDENT *)malloc(n*sizeof(STUDENT));
    ReadResult("result.dat",stud);
    //输出学生信息
    Print(stud,n,m);
    free(stud);
    return 0;
}
void Input(STUDENT *stud, int n,int m)
{
    int i;
    //freopen("Input.txt","r",stdin);
    //scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
    {
        scanf("%ld",&stud[i].studentID);
        scanf("%s",stud[i].studentName);
        scanf("%s",stud[i].sex);
        scanf("%d-%d-%d",&stud[i].birthday.year,&stud[i].birthday.month,&stud[i].birthday.day);
        for(int j=0;j<m;j++)
            scanf("%f",&stud[i].score[j]);
        stud[i].total = 0;
        stud[i].average = 0;
        stud[i].rank = 0;
    }
}
void Print(STUDENT *stud, int n,int m)
{
    printf("%8s%12s%4s%12s%10s%10s%10s%10s%10s%10s%5s\n",
           "  NO.  ","Name","Sex"," Birthday ","Computer","English","Math","Music","Total","Average","Rank");
    for(int i=0;i<n;i++)
    {
        printf("%8ld",stud[i].studentID);
        printf("%15s",stud[i].studentName);
        printf("%5s",stud[i].sex);
        printf("%6d-%02d-%02d",stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day);
        for(int j=0;j<m;j++)
        {
            printf("%10.0f",stud[i].score[j]);
        }
        printf("%10.0f",stud[i].total);
        printf("%10.0f",stud[i].average);
        printf("%5d\n",stud[i].rank);
    }
}

void TotalAndAverage(STUDENT *stud, int n,int m)
{
    for(int i=0;i<n;i++)
    {
        stud[i].total = 0;
        for(int j=0;j<m;j++)
            stud[i].total += stud[i].score[j];

        stud[i].average = stud[i].total/4;
    }
}

void RankByTotal(STUDENT *stud, int n,int m)
{

    for(int i=0;i<n-1; i++)
    {
        int k = i;
        for(int j=i+1;j<n;j++)
        {
            if(stud[j].total>stud[k].total)
            {
                k = j;
            }
        }
        if(k != i)
        {
            STUDENT temp = stud[i];
            stud[i] = stud[k];
            stud[k] = temp;
        }
        stud[i].rank = i+1;
        if(i>0 && stud[i].total == stud[i-1].total)
            stud[i].rank = stud[i-1].rank;
    }
    stud[n-1].rank = n;
    if(n-1>0 && stud[n-1].total == stud[n-2].total)
        stud[n-1].rank = stud[n-2].rank;
}

void SaveStudInfo(const char *fileName,STUDENT *stud,int n,int m)
{
    FILE *fp = fopen(fileName,"w");  //打开二进制文件student.dat用于写
    if(fp == NULL)
    {
        printf("Failure to open %s!\n",fileName);
        exit(0);
    }
    fwrite(&n,sizeof(n),1,fp);//将n写入文件
    fwrite(&m,sizeof(m),1,fp);//将m写入文件

    fwrite(stud,sizeof(STUDENT),n,fp);
    fclose(fp); //关闭文件
}

void ReadResult(const char *fileName,STUDENT *stud)
{
    FILE *fp = fopen(fileName,"r");  //打开二进制文件result.dat用于读
    if(fp == NULL)
    {
        printf("Failure to open %s!\n",fileName);
        exit(0);
    }
    int n,m;
    // 读一个整数(学生人数)
    fread(&n,sizeof(n),1,fp);
    // 课程数量
    fread(&m,sizeof(m),1,fp);

    fread(stud,sizeof(STUDENT),n,fp);

    fclose(fp);//关闭文件
}
//从文件fileName表示的二进制文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char *fileName, STUDENT stud[])
{
/*************Begin***************/
    FILE *fp = fopen(fileName,"r");
    if(fp == NULL)
    {
        printf("Failure to open %s!\n",fileName);
        exit(0);
    }
    int n,m;
    fread(&n,sizeof(n),1,fp);
    fread(&m,sizeof(m),1,fp);
    fread(stud,sizeof(STUDENT),n,fp);
    fclose(fp);
/*************End*****************/
}
//向文件fileName表示的二进制文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[],int n,int m)
{
    FILE *fp = fopen(fileName,"w");
    if(fp == NULL)
    {
        printf("Failure to open %s!\n",fileName);
        exit(0);
    }
    fwrite(&n,sizeof(n),1,fp);
    fwrite(&m,sizeof(m),1,fp);
    fwrite(stud,sizeof(STUDENT),n,fp);
    fclose(fp);
}

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员Bob 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编程要求
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档