while (!feof(p)) {
fread(&card, sizeof(student), 1, p); // 每次讀到同一個 card 變量
n++;
}
// 後續遍歷 card[k] 實際訪問的是同一塊內存(最後一次讀取的數據)
fread(&card, ...) 每次將數據讀入**同一個結構體變量** card,導致前一次數據被覆蓋。n 雖然計數正確,但數組 card[k] 並不存在(除非 card 是數組且指針遞增)。
malloc 新節點掛接。student card[MAX],讀取時 fread(&card[n], ...) 遞增下標。#define MAX_STU 1000
student card[MAX_STU];
int n = 0;
while (n < MAX_STU && fread(&card[n], sizeof(student), 1, p) == 1) {
n++;
}
// 後續遍歷 card[0] ~ card[n-1] 即可
void displayuser() {
FILE *p = fopen("card", "rb"); // 二進制讀取
if (!p) { perror("open"); return; }
student card[MAX_STU];
int n = 0;
while (n < MAX_STU && fread(&card[n], sizeof(student), 1, p) == 1) n++;
fclose(p);
if (n == 0) { printf("無數據\n"); return; }
printf("┏━━━━┳━━━━━┳━━━━━━━┓\n");
printf("┃ 姓名 ┃ 班級 ┃ 學號 ┃\n");
printf("┣━━━━╋━━━━━╋━━━━━━━┫\n");
for (int k = 0; k < n; k++) {
if (card[k].stuclass[0] != '\0') {
printf("┃%-8s┃%-10s┃%-14d┃\n", card[k].stuname, card[k].stuclass, card[k].stunum);
}
}
printf("┗━━━━┻━━━━━┻━━━━━━━┛\n");
}
fread 返回值判斷 (== 1) 比 feof 更可靠。"rb" 讀取結構體數組。