任务2. 编写程序binrw.c,从标准输入5个学生的成绩信息,包括学号、姓名、语文、数学、英语,成绩允许有一位小数,存入一个结构体数组,结构体定义为: typedef struct _subject { char sno[20]; //学号 char name[20]; //姓名 float chinese; //语文成绩 float math; //数学成绩 float english; //英语成绩 } subject; 将学生信息,逐条记录写入数据文件data,最后读回第1、3、5条学生成绩记录,显示出来,检查读出结果是否正确。
时间: 2024-01-20 08:02:13 浏览: 110
以下是 binrw.c 的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define NUM_STUDENTS 5
typedef struct _subject {
char sno[20]; //学号
char name[20]; //姓名
float chinese; //语文成绩
float math; //数学成绩
float english; //英语成绩
} subject;
int main() {
// 输入学生信息
subject students[NUM_STUDENTS];
for (int i = 0; i < NUM_STUDENTS; i++) {
printf("请输入第%d个学生的信息:\n", i + 1);
printf("学号:");
scanf("%s", students[i].sno);
printf("姓名:");
scanf("%s", students[i].name);
printf("语文成绩:");
scanf("%f", &(students[i].chinese));
printf("数学成绩:");
scanf("%f", &(students[i].math));
printf("英语成绩:");
scanf("%f", &(students[i].english));
}
// 写入数据文件
FILE* fp = fopen("data", "wb");
if (fp == NULL) {
printf("无法打开数据文件\n");
exit(1);
}
fwrite(students, sizeof(subject), NUM_STUDENTS, fp);
fclose(fp);
// 读取数据文件
fp = fopen("data", "rb");
if (fp == NULL) {
printf("无法打开数据文件\n");
exit(1);
}
subject read_students[NUM_STUDENTS];
fread(read_students, sizeof(subject), NUM_STUDENTS, fp);
fclose(fp);
// 输出第1、3、5个学生的信息
printf("第1、3、5个学生的信息:\n");
printf("%s %s %.1f %.1f %.1f\n", read_students[0].sno, read_students[0].name, read_students[0].chinese, read_students[0].math, read_students[0].english);
printf("%s %s %.1f %.1f %.1f\n", read_students[2].sno, read_students[2].name, read_students[2].chinese, read_students[2].math, read_students[2].english);
printf("%s %s %.1f %.1f %.1f\n", read_students[4].sno, read_students[4].name, read_students[4].chinese, read_students[4].math, read_students[4].english);
return 0;
}
```
程序的主要流程如下:
1. 定义结构体类型 `subject` 来保存学生信息。
2. 从标准输入读入 5 个学生的信息,保存在 `students` 数组中。
3. 打开数据文件 `data`,以二进制写入模式将 `students` 数组写入文件。
4. 关闭数据文件。
5. 重新打开数据文件 `data`,以二进制读取模式将文件内容读入 `read_students` 数组。
6. 关闭数据文件。
7. 输出第 1、3、5 个学生的信息。
注意事项:
1. 在使用 `scanf` 函数读取字符串时,要使用 `%s` 格式化字符串,而不是 `%c`。
2. 在使用 `scanf` 函数读取浮点数时,要使用 `%f` 格式化字符串。
3. 在使用 `fwrite` 和 `fread` 函数时,要注意第 2 和第 4 个参数的大小应该是结构体类型的大小,而不是结构体数组的大小。
阅读全文