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

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

本关任务与上一关任务相似。

相关知识(略)
编程要求

本关的编程任务是补全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 
#include 
#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;
}

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

测试样例


相关文章
|
7月前
|
人工智能 BI
文件的读写
文件的读写。
42 0
|
6月前
|
存储 固态存储 文件存储
磁盘文件的读写是怎样进行的
深入理解磁盘文件读写操作
|
7月前
|
存储 C语言
顺序读写数据文件
顺序读写数据文件
56 1
|
7月前
|
C语言
随机读写数据文件
随机读写数据文件
44 1
|
存储
按数据块读写文件存取学生信息
按数据块读写文件存取学生信息
【文件随机读写和文件缓冲区】
1.1fseek函数 根据文件指针的位置和偏移量来定位文件指针。 看不懂没关系,举个例子你就明白了。 我们首先在text.txt文件中放入 “abcdef” 这些字符。
|
计算机视觉 索引 Windows
视频操作_01视频读写:视频读写+读取视频+保存视频
在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象
199 0
|
SQL 存储 缓存
MySQL日志顺序读写及数据文件随机读写原理
MySQL在实际工作时候的两种数据读写机制: 对redo log、binlog这种日志进行的磁盘顺序读写 对表空间的磁盘文件里的数据页进行的磁盘随机读写
232 0
|
存储 固态存储 数据库
随机读写 vs 顺序读写
随机读写 vs 顺序读写
|
SQL Oracle 算法
物理读之LRU(最近最少被使用)的深入解析
LRU算法,不但在操作系统中有,在数据库中也有,下面我以Oracle数据库的LRU算法为例给大家分享,解析它背后的原理。
物理读之LRU(最近最少被使用)的深入解析