首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言結構體數組讀取顯示只有最後一行:指針未遞增導致覆蓋

     編輯:程式設計綜合問答

錯誤代碼

while (!feof(p)) {
    fread(&card, sizeof(student), 1, p); // 每次讀到同一個 card 變量
    n++;
}
// 後續遍歷 card[k] 實際訪問的是同一塊內存(最後一次讀取的數據)

原因

fread(&card, ...) 每次將數據讀入**同一個結構體變量** card,導致前一次數據被覆蓋。n 雖然計數正確,但數組 card[k] 並不存在(除非 card 是數組且指針遞增)。

修正方案

  1. 動態分配數組:先讀取總筆數或邊讀邊擴容。
  2. 鏈表存儲:每次 malloc 新節點掛接。
  3. 固定大小數組:定義 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" 讀取結構體數組。
  • 結構體對齊/填充可能導致跨平台文件不兼容,生產環境建議序列化 (JSON/Protobuf)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved