用c语言编程:文件" stu _ infol . txt "包含学生的基本信息(姓名、学号、籍贯三项),现在需要从该文件中读出信息,并依次为每位学生输入三门课程成绩,计算平均成绩,再将学生完整信息(姓名、学号、籍贯、课程1、课程2、课程3、平均分)写入文件" stu _info2. txt "并保存于磁盘上。
时间: 2023-12-22 17:11:54 浏览: 95
java_stu_search.rar_Java 查询系统_stu_search_学生信息查询_学生信息查询系统
好的,这是一个使用C语言实现的文件读写操作,实现从一个文件读取学生基本信息,再输入三个科目的成绩并计算平均分,最后将完整信息写入另一个文件的程序。以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最大学生数
#define MAX_NAME_LEN 20 // 姓名最大长度
#define MAX_ID_LEN 10 // 学号最大长度
#define MAX_ADDRESS_LEN 50 // 籍贯最大长度
#define FILENAME_IN "stu_infol.txt" // 输入文件名
#define FILENAME_OUT "stu_info2.txt" // 输出文件名
typedef struct {
char name[MAX_NAME_LEN];
char id[MAX_ID_LEN];
char address[MAX_ADDRESS_LEN];
float score[3]; // 三个科目的成绩
float avg_score; // 平均分
} Student;
int main() {
FILE *fp_in, *fp_out;
Student students[MAX_STUDENT_NUM];
int i = 0, j = 0;
char buf[100];
// 打开输入文件
fp_in = fopen(FILENAME_IN, "r");
if (fp_in == NULL) {
printf("Can't open file %s\n", FILENAME_IN);
exit(1);
}
// 读取学生信息
while (fgets(buf, 100, fp_in) != NULL) {
sscanf(buf, "%s %s %s", students[i].name, students[i].id, students[i].address);
i++;
}
// 关闭输入文件
fclose(fp_in);
// 输入成绩并计算平均分
for (j = 0; j < i; j++) {
printf("请输入%s的三门科目成绩(用空格隔开):", students[j].name);
scanf("%f %f %f", &students[j].score[0], &students[j].score[1], &students[j].score[2]);
students[j].avg_score = (students[j].score[0] + students[j].score[1] + students[j].score[2]) / 3;
}
// 打开输出文件
fp_out = fopen(FILENAME_OUT, "w");
if (fp_out == NULL) {
printf("Can't open file %s\n", FILENAME_OUT);
exit(1);
}
// 写入完整信息并保存到输出文件
for (j = 0; j < i; j++) {
fprintf(fp_out, "%s %s %s %.1f %.1f %.1f %.1f\n", students[j].name, students[j].id, students[j].address,
students[j].score[0], students[j].score[1], students[j].score[2], students[j].avg_score);
}
// 关闭输出文件
fclose(fp_out);
printf("操作完成!\n");
return 0;
}
```
在程序中,我们首先定义了一个 `Student` 结构体,包含了学生的基本信息和成绩信息。然后我们使用 `fgets` 函数从输入文件中逐行读取信息,并使用 `sscanf` 函数将每行的信息解析到对应的 `Student` 结构体中。接着,我们使用 `scanf` 函数输入每位学生的三门成绩,并计算平均分。最后,我们使用 `fprintf` 函数将每位学生的完整信息写入输出文件。
需要注意的是,在使用 `sscanf` 函数解析信息时,我们使用了 `%s` 格式符来读取字符串,这意味着如果某个字段的长度超过了我们定义的最大长度,会导致缓冲区溢出,因此应该在读取前检查字段长度。在实际应用中,还应该加入其它的错误处理和容错机制,以保证程序的稳定和可靠性。
阅读全文