C语言编写点名程序。 文本文件 C:\Users\libinling\Desktop\student.txt中存放了若干名学生的学号和出勤次数,从该文件中读取这些信息分别存放在两个不同的数组中,然后依次点名,根据出勤情况修改相应学生的出勤次数,最后将更新后的出勤情况再次写入文件 C:\Users\libinling\Desktop\student.txt
时间: 2023-07-07 10:45:55 浏览: 140
一个用C语言编写的学生信息管理系统,学生数据保存在文本文件中
好的,这是一个比较典型的文件读写操作和数组操作结合的问题。我会给出一个简单的C语言实现,希望能够帮助到你。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
#define FILE_PATH "C:\\Users\\libinling\\Desktop\\student.txt"
struct Student {
char id[20];
int attendance;
};
int main() {
struct Student students[MAX_STUDENT_NUM];
int num = 0;
// 读取文件内容到数组中
FILE *fp = fopen(FILE_PATH, "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return 1;
}
char buf[50];
while (fgets(buf, sizeof(buf), fp) != NULL) {
sscanf(buf, "%s%d", students[num].id, &(students[num].attendance));
num++;
}
fclose(fp);
// 点名,修改出勤情况
for (int i = 0; i < num; i++) {
printf("请回答,学号为%s的同学是否出勤(1表示出勤,0表示缺勤):", students[i].id);
int ans;
scanf("%d", &ans);
if (ans == 1) {
students[i].attendance++;
}
}
// 将更新后的出勤情况写回文件
fp = fopen(FILE_PATH, "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return 1;
}
for (int i = 0; i < num; i++) {
fprintf(fp, "%s %d\n", students[i].id, students[i].attendance);
}
fclose(fp);
printf("点名结束,已更新文件!\n");
return 0;
}
```
解释一下上述代码的思路:
1. 定义一个结构体 `Student`,包含学号和出勤次数两个字段。
2. 定义一个数组 `students`,用来存放所有学生的信息。
3. 定义一个变量 `num`,表示学生的数量,初值为0。
4. 打开文件,并逐行读取文件内容到数组中,同时将 `num` 加1。
5. 对于每个学生,询问其是否出勤,若出勤则将出勤次数加1。
6. 将更新后的数组内容再次写回文件中。
需要注意的是,文件的路径要使用双反斜杠转义,否则会被当做转义字符处理。同时,为了简化处理,这里假设学生数量不超过100,如果需要处理更多的学生,可以自行调整数组大小。
阅读全文