保存了,直接成为一个文件,打开之后查不到学生信息了

img


这个是我们C语言的,代码什么都可以运行,就是存入学生信息之后,会生成一个文件,但是再次运行查不到上一次保存的学生信息。这个是学籍管理系统设计

把代码贴出来,否则没法帮你运行调试。对了,你的开发环境是?


#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;
        }
    }
}
 
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7753140
  • 这篇博客你也可以参考下:C语言数组存储学生信息,并通过姓名获得该学生其他信息
  • 除此之外, 这篇博客: C语言制作一个学生信息管理系统【附代码】中的 5) 查找学生信息 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 
    intBianli(student Information[])
    
    {
    
      int caozuo = 0;
    
      printf("请选择确定学生的方式\n");
    
      printf("1.按学号:\n");
    
      printf("2.按姓名:\n");
    
      scanf_s("%d", &caozuo);
    
      switch (caozuo)
    
      {
    
      case 1:
    
      {
    
      intemt_Information1 = 666;        //当Bianlian()未查到相应的学生信息时,返回emt_Information1,值为666;
    
      charnum[8];
    
      printf_s("请输入学号\n");
    
      getchar();
    
      gets_s(num);
    
      intj;
    
      intstop1 = 0;
    
      for(j = 0; stop1 == 0; j++)
    
      {
    
      /*printf_s("按学号查询计数j的显示 %d\n", j);*/
    
      if (strcmp(Information[j].num, num) == 0)
    
      {
    
      stop1++;
    
      returnj;
    
      }
    
      if (stop1 == 1)
    
      break;
    
      if (j == N - 1)
    
      break;
    
      }
    
      if(Information[j].n == 0)
    
      {
    
      printf("此学生不存在");
    
      return emt_Information1;
    
      }
    
      }
    
      break;
    
      case 2:
    
      {
    
      intemt_Information2 = 666;
    
      charname[8];
    
      printf_s("请输入姓名\n");
    
      getchar();
    
      gets_s(name);
    
      intL;
    
      intstop2 = 0;
    
      for(L = 0; stop2 == 0; L++)
    
      {==
    
      printf_s("按学号查询计数j的显示 %d\n", L);
    
      if (strcmp(Information[L].name, name) ==0)
    
      {
    
      stop2++;
    
      returnL;
    
      }
    
      if (stop2 == 1)
    
      break;
    
      if (L == N - 1)
    
      break;
    
      }
    
      if(Information[L].n == 0)
    
      {
    
      printf("此学生不存在");
    
      return emt_Information2;
    
      }
    
      }
    
      }
    
    }
    
  • 您还可以看一下 包东华老师的C语言学生信息管理系统课程中的 输出指定学生的信息小节, 巩固相关知识点