C语言 将文件 stu_info2.txt 中学生信息读出,按照平均分排序处理,再重新写入文件 “stu_sort.txt”并保存于磁盘上。
时间: 2023-12-06 12:42:30 浏览: 126
以下是一个示例代码,实现了对文件 "stu_info2.txt" 中学生信息的读取、排序和写入到文件 "stu_sort.txt" 中:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
// 定义学生结构体
typedef struct {
char name[20]; // 姓名
int id; // 学号
float scores[3]; // 三门成绩
float avg_score; // 平均成绩
} Student;
// 比较函数,用于 qsort 函数排序
int cmp(const void* a, const void* b) {
Student* s1 = (Student*)a;
Student* s2 = (Student*)b;
if (s1->avg_score > s2->avg_score) {
return -1;
} else if (s1->avg_score < s2->avg_score) {
return 1;
} else {
return 0;
}
}
int main() {
FILE* fp;
Student students[MAX_STUDENTS];
int num_students = 0;
// 打开文件 stu_info2.txt
fp = fopen("stu_info2.txt", "r");
if (fp == NULL) {
printf("Cannot open file stu_info2.txt\n");
exit(1);
}
// 读取学生信息
char line[100];
while (fgets(line, sizeof(line), fp)) {
// 解析每行数据
char* name = strtok(line, ",");
int id = atoi(strtok(NULL, ","));
float scores[3];
for (int i = 0; i < 3; i++) {
scores[i] = atof(strtok(NULL, ","));
}
// 将数据存入学生结构体中
Student student;
strncpy(student.name, name, sizeof(student.name));
student.id = id;
memcpy(student.scores, scores, sizeof(scores));
student.avg_score = (scores[0] + scores[1] + scores[2]) / 3.0;
students[num_students++] = student;
}
fclose(fp);
// 对学生数组进行排序
qsort(students, num_students, sizeof(Student), cmp);
// 写入文件 stu_sort.txt
fp = fopen("stu_sort.txt", "w");
if (fp == NULL) {
printf("Cannot create file stu_sort.txt\n");
exit(1);
}
for (int i = 0; i < num_students; i++) {
fprintf(fp, "%s,%d,%.2f,%.2f,%.2f,%.2f\n", students[i].name, students[i].id,
students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].avg_score);
}
fclose(fp);
printf("Sorted student data written to file stu_sort.txt\n");
return 0;
}
```
在上面的代码中,我们使用了一个结构体 `Student` 来存储每个学生的信息,包括姓名、学号、三门成绩和平均成绩。我们先打开文件 "stu_info2.txt",并按行读取每个学生的信息,解析后存入 `Student` 结构体数组中。然后使用 `qsort` 函数对数组进行排序,排序使用了自定义的比较函数 `cmp`,按照学生的平均成绩从高到低排序。最后将排序后的结果写入到文件 "stu_sort.txt" 中。
需要注意的是,在代码中我们使用了 C 标准库函数 `fgets` 来读取文件中的每行数据,并使用了 `strtok` 函数来解析每行数据。同时,我们将每个学生的信息存储在一个数组中,因此代码有一个 `MAX_STUDENTS` 的宏定义,用于限制最大学生数。如果文件中的学生数超过了这个值,代码会出现错误。另外,我们在写入文件时使用了 `fprintf` 函数,将每个学生的信息格式化后写入文件中。
阅读全文