请用完整的C语言代码,要求用C语言编写: 且1.编写一个带结构的文件,存入电脑, 2.从电脑中读入一个带结构的文件,并进行删增改后,重新存入电脑, 3.文件是有纵横结构,每横表示一个记录 在c中写入文件的第一行是 姓名 班级 学号 文件的第二行是 狗蛋 1 90 可以直接在c中实现增加或删除或修改记录的功能
时间: 2024-03-10 14:50:34 浏览: 56
以下是一个简单的实现,可以满足您的需求。注意,本代码可能存在一些不完善的地方,仅供参考。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_STUDENT_NUM 100
// 学生信息结构体
typedef struct {
char name[MAX_NAME_LEN];
int class_id;
int student_id;
int score;
} Student;
// 学生信息列表结构体
typedef struct {
Student students[MAX_STUDENT_NUM];
int count;
} StudentList;
// 从文件中读取学生信息列表
void read_student_list(StudentList *list, const char *filename) {
FILE *file = fopen(filename, "r");
if (file == NULL) {
printf("Failed to open file %s!\n", filename);
return;
}
fscanf(file, "%s %s %s", list->students[0].name, list->students[0].class_id, list->students[0].student_id);
list->count = 1;
while (fscanf(file, "%s %d %d %d", list->students[list->count].name, &list->students[list->count].class_id,
&list->students[list->count].student_id, &list->students[list->count].score) != EOF) {
list->count++;
}
fclose(file);
}
// 将学生信息列表写入文件
void write_student_list(const StudentList *list, const char *filename) {
FILE *file = fopen(filename, "w");
if (file == NULL) {
printf("Failed to open file %s!\n", filename);
return;
}
fprintf(file, "%-10s %-10s %-10s %-10s\n", "姓名", "班级", "学号", "成绩");
for (int i = 0; i < list->count; i++) {
fprintf(file, "%-10s %-10d %-10d %-10d\n", list->students[i].name, list->students[i].class_id,
list->students[i].student_id, list->students[i].score);
}
fclose(file);
}
// 添加学生信息
void add_student(StudentList *list, const Student *student) {
if (list->count >= MAX_STUDENT_NUM) {
printf("The student list is full!\n");
return;
}
memcpy(&list->students[list->count], student, sizeof(Student));
list->count++;
}
// 删除学生信息
void delete_student(StudentList *list, const char *name) {
for (int i = 0; i < list->count; i++) {
if (strcmp(list->students[i].name, name) == 0) {
for (int j = i; j < list->count - 1; j++) {
memcpy(&list->students[j], &list->students[j + 1], sizeof(Student));
}
list->count--;
return;
}
}
printf("No such student %s!\n", name);
}
// 修改学生信息
void modify_student(StudentList *list, const char *name, const Student *new_student) {
for (int i = 0; i < list->count; i++) {
if (strcmp(list->students[i].name, name) == 0) {
memcpy(&list->students[i], new_student, sizeof(Student));
return;
}
}
printf("No such student %s!\n", name);
}
int main() {
StudentList list;
read_student_list(&list, "students.txt"); // 从文件中读取学生信息列表
printf("原始学生信息:\n");
write_student_list(&list, "students.txt"); // 输出学生信息列表
printf("\n");
// 添加新学生
Student new_student = {"小明", 2, 101, 80};
add_student(&list, &new_student);
printf("添加新学生后的学生信息:\n");
write_student_list(&list, "students.txt"); // 输出学生信息列表
printf("\n");
// 删除学生
delete_student(&list, "狗蛋");
printf("删除学生后的学生信息:\n");
write_student_list(&list, "students.txt"); // 输出学生信息列表
printf("\n");
// 修改学生信息
Student modified_student = {"小红", 1, 100, 95};
modify_student(&list, "小明", &modified_student);
printf("修改学生信息后的学生信息:\n");
write_student_list(&list, "students.txt"); // 输出学生信息列表
printf("\n");
return 0;
}
```
本代码中使用了两个结构体:`Student` 表示一个学生的信息,`StudentList` 表示学生信息列表。`read_student_list` 函数从文件中读取学生信息列表,`write_student_list` 函数将学生信息列表写入文件。`add_student` 函数向学生信息列表中添加一个学生信息,`delete_student` 函数从学生信息列表中删除一个学生信息,`modify_student` 函数修改学生信息列表中的一个学生信息。在 `main` 函数中,我们先读取学生信息列表,然后依次进行添加、删除、修改操作,最后将修改后的学生信息列表写入文件。
阅读全文