这个c语言设计的学籍管理系统,他能运行,但是保存不了,才大一,希望有好像的人指导一下

img


这个是我们需要的程序设计,这个程序他在录入人员信息后保存不进去,后面的还是有一些迷茫,希望有人帮忙改一下,或者指导一下,当然帮忙改一下最好😀

把代码贴上来,这样方便大家帮忙。
写了个保存到文件的函数void Savetofile(struct Student students[], int count),其他几个小错误修改,改动处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
#define MAX_STUDENTS 10
#define MAX_SUBJECTS 3
struct Student {
    int studentID;
    char name[50];
    char className[50];
    int scores[MAX_SUBJECTS];
    float averageScore;
};
void inputStudentInfo(struct Student* student) {
    printf("Enter student ID: ");
    scanf("%d", &(student->studentID));
    printf("Enter student name: ");
    scanf("%s", student->name);
    getchar();                // 修改
    printf("Enter student class name: ");
    scanf("%s", student->className);
    getchar();                // 修改
    printf("Enter scores for C Language, Advanced Math, and English:\n");
    for (int i = 0; i < MAX_SUBJECTS; i++) {
        scanf("%d", &(student->scores[i]));
    }
}
void displayStudentInfo(struct Student student) {
    printf("Student ID: %d\n", student.studentID);
    printf("Student Name: %s\n", student.name);
    printf("Class Name: %s\n", student.className);
    printf("Scores: C Language - %d, Advanced Math - %d, English - %d\n",
        student.scores[0], student.scores[1], student.scores[2]);
    printf("Average Score: %.2f\n", student.averageScore);
    printf("-----------------------------\n");
}
void calculateAverageScore(struct Student* student) {
    int sum = 0;
    for (int i = 0; i < MAX_SUBJECTS; i++) {
        sum += student->scores[i];
    }
    student->averageScore = (float)sum / MAX_SUBJECTS;
}
void displayAllStudents(struct Student students[], int count) {
    for (int i = 0; i < count; i++) {
        displayStudentInfo(students[i]);
    }
}
struct Student* findStudentByID(struct Student students[], int count, int studentID) {
    for (int i = 0; i < count; i++) {
        if (students[i].studentID == studentID) {
            return &(students[i]);
        }
    }
    return NULL;
}
int compareStudents(const void* a, const void* b) {
    struct Student* studentA = (struct Student*)a;
    struct Student* studentB = (struct Student*)b;
    return (studentA->averageScore > studentB->averageScore) -
        (studentA->averageScore < studentB->averageScore);
}
void Savetofile(struct Student students[], int count)      // 修改
{
    FILE* fp;
    int  i;
    if (!count) {
        printf("Record is NULL.\n");
        return;
    }
    fp = fopen("student.txt", "w");
    if (fp) {
        for (i = 0; i < count; i++)
            fprintf(fp, "%d %s %s %d %d %d %f\n", students[i].studentID, students[i].name, students[i].className,
                        students[i].scores[0], students[i].scores[1], students[i].scores[2], students[i].averageScore);
        fclose(fp);
        printf("Save file successfully!\n");
    }
    else
        printf("Save file fail.\n");
    return;
}

int main() {
    struct Student students[MAX_STUDENTS], * studentToModify, * foundStudent, * studentToCalculate; //  修改
    int studentCount = 0;
    int choice, studentID, deleteIndex = -1; // 修改
    while (1) {
        printf("----- Student Management System -----\n");
        printf("1. Add Student\n");
        printf("2. Modify Student\n");
        printf("3. Delete Student\n");
        printf("4. Display All Students\n");
        printf("5. Calculate Average Score\n");
        printf("6. Find Student by ID\n");
        printf("7. Sort Students by Average Score\n");
        printf("8. Save to File\n");
        printf("9. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);
        switch (choice) {
        case 1:
            if (studentCount < MAX_STUDENTS) {
                printf("--- Add Student ---\n");
                inputStudentInfo(&(students[studentCount]));
                calculateAverageScore(&(students[studentCount]));
                studentCount++;
                printf("Student added successfully!\n");
            }
            else {
                printf("Maximum number of students reached. Cannot add more students.\n");
            }
            break;
        case 2:
            printf("--- Modify Student ---\n");
            printf("Enter the student ID to modify: ");
            scanf("%d", &studentID);
            studentToModify = findStudentByID(students,studentCount, studentID);  //struct Student*   修改
            if (studentToModify != NULL) {
                inputStudentInfo(studentToModify);
                calculateAverageScore(studentToModify);
                printf("Student modified successfully!\n");
            }
            else {
                printf("Student not found.\n");
            }
            break;
        case 3:
            printf("--- Delete Student ---\n");
            printf("Enter the student ID to delete: ");
            scanf("%d", &studentID);
            //int deleteIndex = -1;      修改
            for (int i = 0; i < studentCount; i++) {
                if (students[i].studentID == studentID) {
                    deleteIndex = i;
                    break;
                }
            }
            if (deleteIndex != -1) {
                for (int i = deleteIndex; i < studentCount - 1; i++) {
                    students[i] = students[i + 1];
                }
                studentCount--;
                printf("Student deleted successfully!\n");
            }
            else {
                printf("Student not found.\n");
            }
            break;
        case 4:
            printf("--- Display All Students ---\n");
            displayAllStudents(students, studentCount);
            break;
        case 5:
            printf("--- Calculate Average Score ---\n");
            printf("Enter the student ID: ");
            scanf("%d", &studentID);
            studentToCalculate = findStudentByID(students, studentCount, studentID); //struct Student*  修改
            if (studentToCalculate != NULL) {
                calculateAverageScore(studentToCalculate);
                printf("Average score calculated successfully!\n");
            }
            else {
                printf("Student not found.\n");
            }
            break;
        case 6:
            printf("--- Find Student by ID ---\n");
            printf("Enter the student ID to find: ");
            scanf("%d", &studentID);
            foundStudent = findStudentByID(students, studentCount, studentID);   //struct Student*  修改
                
            if (foundStudent != NULL) {
                displayStudentInfo(*foundStudent);
            }
            else {
                printf("Student not found.\n");
            }
            break;
        case 7:
            printf("--- Sort Students by Average Score ---\n");
            qsort(students, studentCount, sizeof(struct Student), compareStudents);
            printf("Students sorted successfully!\n");
            break;
        case 8:                                          // 修改
            printf("--- Save to File. ---\n");           // 修改
            Savetofile(students, studentCount);          // 修改 
            break;
        case 9:
            printf("Exiting the program...\n");
            return 0;
        default:
            printf("Invalid choice. Please try again.\n");
            break;
        }
    }
}

可能存在的问题:
1.文件无法打开或创建。这可能是由于没有正确设置文件路径或文件不存在而导致的。可以使用文件操作函数,如fopen()来打开/创建文件,并检查返回值以确保文件是否成功打开或创建。同时,文件打开模式(如“w”写模式)也需要正确设置。
2.文件指针位置没有重新定位。在读写文件时,文件指针指向当前读写位置。录入信息后,需要使用fseek()或rewind()等函数将文件指针重新定位到文件开头,然后才能将数据读入或写入文件。
3.文件不是文本文件。如果数据文件不是文本文件,可能需要进行二进制文件读写操作。在这种情况下,不能使用常用的fgets()和fputs()函数进行文件读写,而必须使用fread()和fwrite()等函数。

#include <stdio.h>
#include <stdlib.h>
#define MAX_STUDENTS 10
#define MAX_SUBJECTS 3
struct Student {
int studentID;
char name[50];
char className[50];
int scores[MAX_SUBJECTS];
float averageScore;
};
void inputStudentInfo(struct Student* student) {
printf("Enter student ID: ");
scanf("%d", &(student->studentID));
printf("Enter student name: ");
scanf("%s", student->name);
printf("Enter student class name: ");
scanf("%s", student->className);
printf("Enter scores for C Language, Advanced Math, and English:\n");
for (int i = 0; i < MAX_SUBJECTS; i++) {
scanf("%d", &(student->scores[i]));
}
}
void displayStudentInfo(struct Student student) {
printf("Student ID: %d\n", student.studentID);
printf("Student Name: %s\n", student.name);
printf("Class Name: %s\n", student.className);
printf("Scores: C Language - %d, Advanced Math - %d, English - %d\n",
student.scores[0], student.scores[1], student.scores[2]);
printf("Average Score: %.2f\n", student.averageScore);
printf("-----------------------------\n");
}
void calculateAverageScore(struct Student* student) {
int sum = 0;
for (int i = 0; i < MAX_SUBJECTS; i++) {
sum += student->scores[i];
}
student->averageScore = (float)sum / MAX_SUBJECTS;
}
void displayAllStudents(struct Student students[], int count) {
for (int i = 0; i < count; i++) {
displayStudentInfo(students[i]);
}
}
struct Student* findStudentByID(struct Student students[], int count, int studentID) {
for (int i = 0; i < count; i++) {
if (students[i].studentID == studentID) {
return &(students[i]);
}
}
return NULL;
}
int compareStudents(const void* a, const void* b) {
struct Student* studentA = (struct Student*)a;
struct Student* studentB = (struct Student*)b;
return (studentA->averageScore > studentB->averageScore) -
(studentA->averageScore < studentB->averageScore);
}
int main() {
struct Student students[MAX_STUDENTS];
int studentCount = 0;
int choice, studentID;
while (1) {
;printf("----- Student Management System -----\n");
printf("1. Add Student\n");
printf("2. Modify Student\n");
printf("3. Delete Student\n");
printf("4. Display All Students\n");
printf("5. Calculate Average Score\n");
printf("6. Find Student by ID\n");
printf("7. Sort Students by Average Score\n");
printf("8. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
if (studentCount < MAX_STUDENTS) {
printf("--- Add Student ---\n");
inputStudentInfo(&(students[studentCount]));
calculateAverageScore(&(students[studentCount]));
studentCount++;
printf("Student added successfully!\n");
} else {
printf("Maximum number of students reached. Cannot add more students.\n");
}
break;
case 2:
printf("--- Modify Student ---\n");
printf("Enter the student ID to modify: ");
scanf("%d", &studentID);
struct Student* studentToModify = findStudentByID(students,
studentCount, studentID);
if (studentToModify != NULL) {
inputStudentInfo(studentToModify);
calculateAverageScore(studentToModify);
printf("Student modified successfully!\n");
} else {
printf("Student not found.\n");
}
break;
case 3:
printf("--- Delete Student ---\n");
printf("Enter the student ID to delete: ");
scanf("%d", &studentID);
int deleteIndex = -1;
for (int i = 0; i < studentCount; i++) {
if (students[i].studentID == studentID) {
deleteIndex = i;
break;
}
}
if (deleteIndex != -1) {
for (int i = deleteIndex; i < studentCount - 1; i++) {
students[i] = students[i + 1];
}
studentCount--;
printf("Student deleted successfully!\n");
} else {
printf("Student not found.\n");
}
break;
case 4:
printf("--- Display All Students ---\n");
displayAllStudents(students, studentCount);
break;
case 5:
printf("--- Calculate Average Score ---\n");
printf("Enter the student ID: ");
scanf("%d", &studentID);
struct Student* studentToCalculate = findStudentByID(students,
studentCount, studentID);
if (studentToCalculate != NULL) {
calculateAverageScore(studentToCalculate);
printf("Average score calculated successfully!\n");
} else {
printf("Student not found.\n");
}
break;
case 6:
printf("--- Find Student by ID ---\n");
printf("Enter the student ID to find: ");
scanf("%d", &studentID);
struct Student* foundStudent = findStudentByID(students, studentCount,
studentID);
if (foundStudent != NULL) {
displayStudentInfo(*foundStudent);
} else {
printf("Student not found.\n");
}
break;
case 7:
printf("--- Sort Students by Average Score ---\n");
qsort(students, studentCount, sizeof(struct Student), compareStudents);
printf("Students sorted successfully!\n");
break;
case 8:
printf("Exiting the program...\n");
return 0;
default:
printf("Invalid choice. Please try again.\n");
break;
}
}
}