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

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



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


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


void ReadStudInfo(const char *fileName, STUDENT stud[]);


其中:


参数fileName是一个二进制格式的文件,位于当前目录,即与源程序文件在同一文件夹下。文件中首先是以二进制数据形式写入的学生人数(整数n,不超过30)和课程数量(整数n,不超过5),然后是n个学生的信息,学生信息在结构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;

文件中存储了 total,average,rank 三项信息,但均为初始值0。

函数ReadStudInfo的第二个参数stud存放读取出来的学生信息。

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


void SaveResult(const char *fileName, STUDENT stud[],int n,int m);


其中:


参数fileName是一个二进制格式文件,位于当前目录,即与源程序文件在同一文件夹下。

文件中首先要求以二进制形式写入学生人数(整数n,不超过30)和课程数量(整数n,不超过5),然后是n个学生的信息。n个学生的信息存放在第二个参数stud开始的n个结构体数据单元中。

每个学生的信息包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次。

测试说明


本关的测试文件是step3/main.c,其中将会调用你在step3/fileBin.c文件中完成的ReadStudInfo函数和SaveResult函数。除此之后,step3/main.c中还对学生信息进行了处理:包括计算总分、平均分和名次。其次还实现了输入测试数据、输出测试结果、写入测试文件(student.dat)、读取测试文件(result.dat):


1.调用函数Input()将标准输入的数据读入内存,然后调用SaveStudInfo()函数将数据再写入到student.dat文本文件,以便为**ReadStudInfo()**函数从文本文件读取学生信息准备测试数据。


2.调用函数ReadResult()将SaveResult()函数保存的result.dat中的学生信息读入内存,并调用Print()函数进行输出。**SaveResult()**函数需要将计算出总分、平均分和名次信息的学生信息存入result.dat。


3.student.dat的示例如下:


4.result.dat的示例如下:



5.step3/main.c主要代码如下:

#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; //指向存放学生信息的存储块的首地址
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);
//打开文件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;
}

平台会对你编写的代码进行测试:

测试样例


相关文章
|
存储 JSON NoSQL
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(下)
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(下)
471 0
|
机器学习/深度学习 数据可视化 网络架构
增强深度学习模型的可解释性和泛化能力的方法研究
【8月更文第15天】在深度学习领域,模型的准确率和预测能力是衡量模型好坏的重要指标。然而,随着模型复杂度的增加,它们往往变得越来越难以理解,这限制了模型在某些关键领域的应用,例如医疗诊断、金融风险评估等。本文将探讨如何通过几种方法来增强深度学习模型的可解释性,同时保持或提高模型的泛化能力。
1295 2
|
域名解析 缓存 网络协议
如何解决域名解析不生效问题?
文中对域名解析不生效的原因进行了分析,并针对最常见的本地递归域名服务器缓存不生效的问题提出了解决方案,尤其移动域名解析HTTPDNS对无线场景下的应用特别有效。
32394 0
|
10月前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
668 15
|
10月前
|
资源调度 数据可视化 项目管理
看板视图如何提升团队效率?
看板视图源自丰田生产系统的管理工具,通过可视化手段展示任务、工作流和项目进度,以卡片形式表示任务,在不同列间移动反映工作进展。它能提高团队协作效率、优化工作流、减少瓶颈,适用于项目管理和软件开发等领域。
快速部署 HeyForm 社区版
借助 HeyForm,任何人都可以轻松创建引人入胜的对话表单,用于调查、问卷、测验和民意调查,无需任何编码技能。本文介绍使用计算巢快速部署HeyForm社区版。
快速部署 HeyForm 社区版
|
弹性计算 对象存储 CDN
阿里云流量费用价格表(每GB流量0.8元,地域不同流量价格不同)
2023阿里云流量费用价格表,每GB流量价格0.8元,地域不同流量价格不同,阿里云百科分享不同地域流量价格
3242 0
阿里云流量费用价格表(每GB流量0.8元,地域不同流量价格不同)
|
域名解析 缓存 网络协议
HttpClient/HttpURLConnection + HttpDns最佳实践
在Android端如果OkHttp作为网络请求框架,由于其提供了自定义DNS服务接口,可以很优雅地结合HttpDns,相关实现可参考:[HttpDns+OkHttp最佳实践](https://help.aliyun.com/document_detail/52008.html?spm=5176.product30100.6.585.USrgj7)。 如果您使用`HttpClient`或`Http
3452 0
|
SQL DataWorks 数据可视化
DataWorks
DataWorks是阿里云提供的一款大数据开发平台,可以帮助用户进行数据的ETL、数据分析和数据可视化等操作。DataWorks提供了一系列的工具和服务,包括数据集成、数据开发、数据建模、数据质量、数据分析和数据可视化等,可以帮助用户快速搭建数据开发和数据分析环境,提高数据的处理效率和质量。
957 0