#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_STUDENT 100  
struct Student {
    char xh[20];   
    char xm[20];   
    char xb[5];    
    int nl;        
    char zy[20];   
};

struct Student students[MAX_STUDENT];  
int count = 0;  

// 新增：保存数据到文件
void saveToFile() {
    // 以"写入"模式打开文件（不存在则创建，存在则覆盖）
    FILE *fp = fopen("students.txt", "w");
    if (fp == NULL) {
        printf("数据保存失败！无法打开文件\n");
        return;
    }
    // 遍历所有学生，写入文件（每行一个学生，逗号分隔）
    for (int i = 0; i < count; i++) {
        fprintf(fp, "%s,%s,%s,%d,%s\n", 
                students[i].xh, 
                students[i].xm, 
                students[i].xb, 
                students[i].nl, 
                students[i].zy);
    }
    fclose(fp); // 关闭文件
    printf("数据已保存到 students.txt 文件\n");
}

// 新增：从文件加载数据
void loadFromFile() {
    FILE *fp = fopen("students.txt", "r");
    if (fp == NULL) {
        printf("未找到数据文件，将创建新文件\n");
        return;
    }
    // 按行读取文件内容，解析为学生信息
    char line[100]; // 存储每行的内容
    while (fgets(line, 100, fp) != NULL && count < MAX_STUDENT) {
        // 去除行尾的换行符
        line[strcspn(line, "\n")] = '\0';
        // 用逗号分割字段（sscanf的格式串对应逗号分隔）
        sscanf(line, "%[^,],%[^,],%[^,],%d,%[^,]", 
               students[count].xh, 
               students[count].xm, 
               students[count].xb, 
               &students[count].nl, 
               students[count].zy);
        count++; // 加载一个学生，总数+1
    }
    fclose(fp);
    printf("成功加载 %d 条学生数据\n", count);
}

void enter() {
    int num;  
    printf("===== 录入学生信息 =====\n");
    printf("请输入要录入的学生数量：");
    scanf("%d", &num);  

    if (count + num > MAX_STUDENT) {
        printf("学生数量超出上限！最多还能录入%d名学生。\n", MAX_STUDENT - count);
        return;
    }

    for (int i = 0; i < num; i++) {
        printf("\n请输入第%d个学生的信息：\n", count + 1);
        printf("学号：");
        scanf("%s", students[count].xh);
        printf("姓名：");
        scanf("%s", students[count].xm);
        printf("性别：");
        scanf("%s", students[count].xb);
        printf("年龄：");
        scanf("%d", &students[count].nl);
        printf("专业：");
        scanf("%s", students[count].zy);
        count++;  
    }

    printf("录入完成！当前共%d名学生。\n", count);
    saveToFile(); // 新增：录入后保存到文件
}

void insert() {
    if (count >= MAX_STUDENT) {
        printf("学生数量已达上限，无法添加！\n");
        return;
    }

    printf("\n===== 添加学生信息 =====\n");
    printf("学号：");
    scanf("%s", students[count].xh);
    printf("姓名：");
    scanf("%s", students[count].xm);
    printf("性别：");
    scanf("%s", students[count].xb);
    printf("年龄：");
    scanf("%d", &students[count].nl);
    printf("专业：");
    scanf("%s", students[count].zy);
    count++;  
    printf("添加成功！当前共%d名学生。\n", count);
    saveToFile(); // 新增：添加后保存到文件
}

void deleteStudent() {
    char name[20];  
    printf("\n===== 删除学生信息 =====\n");
    printf("请输入要删除的学生姓名：");
    scanf("%s", name);  

    for (int i = 0; i < count; i++) {
        if (strcmp(students[i].xm, name) == 0) {
            for (int j = i; j < count - 1; j++) {
                students[j] = students[j + 1];
            }
            count--;  
            printf("姓名为%s的学生已删除！当前共%d名学生。\n", name, count);
            saveToFile(); // 新增：删除后保存到文件
            return;  
        }
    }

    printf("未找到姓名为%s的学生！\n", name);
}

void modify() {
    char name[20];  
    printf("\n===== 修改学生信息 =====\n");
    printf("请输入要修改的学生姓名：");
    scanf("%s", name);  
    getchar(); // 调整：提前清除换行符，避免后续fgets读取空值

    for (int i = 0; i < count; i++) {
        if (strcmp(students[i].xm, name) == 0) {
            printf("请输入新的信息（直接回车表示不修改）：\n");
            
            printf("学号（原：%s）：", students[i].xh);
            char newXh[20];
            fgets(newXh, 20, stdin);
            newXh[strcspn(newXh, "\n")] = '\0';
            if (strlen(newXh) > 0) strcpy(students[i].xh, newXh);

            printf("性别（原：%s）：", students[i].xb);
            char newXb[5];
            fgets(newXb, 5, stdin);
            newXb[strcspn(newXb, "\n")] = '\0';
            if (strlen(newXb) > 0) strcpy(students[i].xb, newXb);

            printf("年龄（原：%d）：", students[i].nl);
            char newNl[10];
            fgets(newNl, 10, stdin);
            newNl[strcspn(newNl, "\n")] = '\0';
            if (strlen(newNl) > 0) students[i].nl = atoi(newNl);

            printf("专业（原：%s）：", students[i].zy);
            char newZy[20];
            fgets(newZy, 20, stdin);
            newZy[strcspn(newZy, "\n")] = '\0';
            if (strlen(newZy) > 0) strcpy(students[i].zy, newZy);

            printf("修改成功！\n");
            saveToFile(); // 新增：修改后保存到文件
            return;  
        }
    }

    printf("未找到姓名为%s的学生！\n", name);
}

void search() {
    char major[20];  
    printf("\n===== 查询学生信息 =====\n");
    printf("请输入要查询的专业：");
    scanf("%s", major);  

    printf("专业为%s的学生信息：\n", major);
    printf("学号\t姓名\t性别\t年龄\t专业\n");
    printf("------------------------------\n");
    
    int found = 0;  
    for (int i = 0; i < count; i++) {
        if (strcmp(students[i].zy, major) == 0) {
            printf("%s\t%s\t%s\t%d\t%s\n", 
                   students[i].xh, students[i].xm, students[i].xb, 
                   students[i].nl, students[i].zy);
            found = 1;  
        }
    }

    if (!found) printf("未找到该专业的学生！\n");
}

void display() {
    printf("\n===== 所有学生信息 =====\n");
    if (count == 0) {
        printf("暂无学生信息！\n");
        return;
    }

    printf("学号\t姓名\t性别\t年龄\t专业\n");
    printf("------------------------------\n");
    for (int i = 0; i < count; i++) {
        printf("%s\t%s\t%s\t%d\t%s\n", 
               students[i].xh, students[i].xm, students[i].xb, 
               students[i].nl, students[i].zy);
    }
}

int main() {
    loadFromFile(); // 新增：程序启动时加载文件数据
    int choice;  
    while (1) {
        printf("\n===== 学生信息管理系统 =====\n");
        printf("1. 录入学生信息\n");
        printf("2. 添加学生信息\n");
        printf("3. 删除学生信息\n");
        printf("4. 修改学生信息\n");
        printf("5. 按专业查询学生\n");
        printf("6. 显示所有学生信息\n");
        printf("0. 退出系统\n");
        printf("请输入操作序号：");
        scanf("%d", &choice);  

        switch (choice) {
            case 1: enter(); break;    
            case 2: insert(); break;   
            case 3: deleteStudent(); break;  
            case 4: modify(); break;   
            case 5: search(); break;   
            case 6: display(); break;  
            case 0: 
                printf("退出系统，再见！\n"); 
                return 0;  
            default: printf("输入错误，请重新选择！\n");  
        }
    }
    return 0;
}
