某班有学生n人、每人的信息包括:学号、姓 名、性别 和成绩。编制一个C程序,完成以下操作 ①定义一个结构体类型数组。 ②打开可读写的新文件student.dat。 ③使用函数fwrite()将结构体数组内容写入文件student.dat中。 关闭文件student.dat. ⑤打开可读写文件student.dat。 ⑥从文件中依次读出各学生情况并按学生成绩进行排序,输出排好序后的数据。 ⑦关闭文件student. dat.
时间: 2024-03-22 10:39:34 浏览: 70
好的,我来解答你的问题。首先,以下是一个实现上述操作的C程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT 100
typedef struct {
int id;
char name[20];
char gender[6];
float score;
} Student;
int compare(const void *a, const void *b) {
Student *s1 = (Student *)a;
Student *s2 = (Student *)b;
return s2->score - s1->score;
}
int main() {
Student students[MAX_STUDENT];
int n;
// 输入学生信息
printf("请输入学生人数: ");
scanf("%d", &n);
printf("请依次输入每个学生的学号、姓名、性别和成绩:\n");
for (int i = 0; i < n; i++) {
scanf("%d%s%s%f", &students[i].id, students[i].name, students[i].gender, &students[i].score);
}
// 将学生信息写入文件
FILE *fp = fopen("student.dat", "wb");
if (fp == NULL) {
printf("打开文件失败!\n");
return 1;
}
fwrite(students, sizeof(Student), n, fp);
fclose(fp);
// 从文件中读取学生信息并按成绩排序
fp = fopen("student.dat", "rb");
if (fp == NULL) {
printf("打开文件失败!\n");
return 1;
}
fread(students, sizeof(Student), n, fp);
qsort(students, n, sizeof(Student), compare);
// 输出排好序的学生信息
printf("按成绩排名后的学生信息如下:\n");
for (int i = 0; i < n; i++) {
printf("%d %s %s %.2f\n", students[i].id, students[i].name, students[i].gender, students[i].score);
}
fclose(fp);
return 0;
}
```
程序的大致流程如下:
1. 定义一个结构体类型 `Student`,用于存储学生信息。
2. 通过 `scanf()` 函数输入学生信息,并将其存储在结构体数组 `students` 中。
3. 打开可读写的二进制文件 `student.dat`,并将结构体数组 `students` 中的内容写入文件中。
4. 关闭文件 `student.dat`。
5. 再次打开文件 `student.dat`,从文件中读取学生信息,并按照成绩从高到低进行排序。
6. 输出排好序的学生信息。
7. 关闭文件 `student.dat`。
需要注意的是,程序中使用了 `fwrite()` 和 `fread()` 函数进行二进制文件的读写,因此在不同的系统上可能会出现兼容性问题。如果需要在不同的系统之间进行文件共享,建议使用文本文件。
阅读全文