现有一个结构体用来描述学生信息,结构体数据成员包括:学号、姓名、三门课程成绩和平均成绩。 typedef struct student{ char sno[SNO_LENGTH]; //学号 char name[NAME_LENGTH]; //姓名 int score[COURSE_NUMBER]; //课程成绩数组 float average; //所有课程的平均成绩 }STU; (1)从键盘输入3个学生的学号、姓名和三门课成绩,然后计算每个学生的平均成绩。之后,将每个学生的结构体数据存放在二进制磁盘文件“ex805.dat”(与源文件“ex805.c”存放于同一个文件夹)中。 (2)读取二进制磁盘文件“ex805.dat”,然后输出到显示器。 目前,已编辑完成main函数、input函数和output函数。请编程实现writeFile函数和readFile函数。具体函数功能及要求如下所示。
时间: 2023-11-27 12:53:10 浏览: 134
```c
#include <stdio.h>
#include <stdlib.h>
#define SNO_LENGTH 10 // 学号长度
#define NAME_LENGTH 10 // 姓名长度
#define COURSE_NUMBER 3 // 课程数量
#define FILE_NAME "ex805.dat" // 文件名称
// 学生结构体
typedef struct student {
char sno[SNO_LENGTH]; // 学号
char name[NAME_LENGTH]; // 姓名
int score[COURSE_NUMBER]; // 课程成绩数组
float average; // 所有课程的平均成绩
} STU;
// 输入学生信息
void input(STU *stu) {
printf("请输入学号:");
scanf("%s", stu->sno);
printf("请输入姓名:");
scanf("%s", stu->name);
printf("请输入三门课程成绩:");
for (int i = 0; i < COURSE_NUMBER; i++) {
scanf("%d", &stu->score[i]);
}
stu->average = (stu->score[0] + stu->score[1] + stu->score[2]) / 3.0;
}
// 输出学生信息
void output(STU *stu) {
printf("学号:%s,姓名:%s,三门课程成绩:%d %d %d,平均成绩:%.2f\n",
stu->sno, stu->name, stu->score[0], stu->score[1], stu->score[2], stu->average);
}
// 写入学生信息到文件中
void writeFile(STU *stu) {
FILE *fp = fopen(FILE_NAME, "ab"); // 以二进制追加模式打开文件
if (fp == NULL) {
printf("无法打开文件!\n");
exit(1);
}
fwrite(stu, sizeof(STU), 1, fp); // 写入学生信息到文件中
fclose(fp); // 关闭文件
}
// 从文件中读取学生信息并输出
void readFile() {
FILE *fp = fopen(FILE_NAME, "rb"); // 以二进制读取模式打开文件
if (fp == NULL) {
printf("无法打开文件!\n");
exit(1);
}
STU stu;
while (fread(&stu, sizeof(STU), 1, fp) == 1) { // 按照STU结构体大小读取文件内容
output(&stu); // 输出学生信息
}
fclose(fp); // 关闭文件
}
int main() {
STU stu;
printf("请输入3个学生的信息:\n");
for (int i = 0; i < 3; i++) {
input(&stu);
writeFile(&stu);
}
printf("学生信息已经成功写入文件!\n");
printf("从文件中读取学生信息并输出:\n");
readFile();
return 0;
}
```
阅读全文