本系統是一個功能完整的控制台學生學籍管理系統,採用結構體數組+二進制文件存儲,實現了登錄驗證、增刪改查、數據持久化、分角色權限控制等核心功能。代碼結構清晰,模塊化程度高,適合作為 C 語言大作業或畢業設計參考。
#define N 100 // 最大支持 100 名學生
struct Date {
int year, month, day;
};
struct Student {
char num[20]; // 學號
char name[25]; // 姓名
char sex[10]; // 性別
struct Date birthday;
int age; // 年齡
char addr[50]; // 籍貫
char dept[50]; // 系別
char major[30]; // 專業
char classs[30]; // 班級
char phone[20]; // 電話
} stu[N];
D:\file.txt,採用 fread/fwrite 整結構體讀寫login()void login() {
// 管理員:密碼 "930322",掩碼顯示 '*'
// 用戶:遍歷學生數組匹配姓名與密碼
// 成功設置 flag=1,失敗提供重試/返回選項
}
亮點:使用 getch() 實現密碼掩碼輸入,角色分離清晰。
load()int load() {
FILE *fp = fopen("D:\\file.txt", "rb");
if (!fp) return 0;
int i;
for (i = 0; !feof(fp); i++) // 注意:feof 判斷在讀取後
fread(&stu[i], sizeof(struct Student), 1, fp);
fclose(fp);
return i - 1; // 修正 feof 多讀一次
}
⚠️ 經典陷阱:feof()在讀取失敗後才置位,循環會多執行一次,需返回i-1或改用返回值判斷。
save()void save(int n) {
FILE *fp = fopen("D:\\file.txt", "wb");
for (int i = 0; i < n; i++)
if (stu[i].name[0] != '\0') // 跳過已刪除記錄(標記為空串)
fwrite(&stu[i], sizeof(struct Student), 1, fp);
fclose(fp);
}
deleter()採用「標記刪除 + 數組前移 + 重寫文件」策略:
stu[k].name[0] = '\0'; // 標記刪除
save(n); // 重寫整個文件
modify()支持單字段修改(11 個選項)或全字段重錄,修改前備份原數據,確認後才持久化。
| 優點 | 不足與改進 |
|---|---|
| ✅ 結構完整,功能齊全 | ⚠️ 硬編碼文件路徑 D:\file.txt |
| ✅ 二進制讀寫效率高 | ⚠️ gets() 不安全,應用 fgets() |
| ✅ 角色權限分離 | ⚠️ 密碼明文存儲,無加密 |
| ✅ 交互邏輯健壯(重試機制) | ⚠️ 無輸入驗證(學號唯一性、日期合法性等) |
| ✅ 代碼模塊化清晰 | 💡 建議:動態內存分配、索引優化、文本/CSV 導出 |
conio.h(getch()、clrscr()),Linux 下可用 termios 替代D:\file.txt 或修改路徑為當前目錄930322