使用 fwrite 以二進制模式("wb")寫入結構體數組到文件,再用文本編輯器打開顯示亂碼;嘗試讀取時將 fclose 放在循環內導致僅讀取第一條記錄。
FILE fp; 應為 FILE *fp;,否則編譯報錯或運行異常。fwrite/fread 按內存原樣寫入結構體(含填充字節、整數二進制表示),文本編輯器無法直接解讀,故顯示亂碼。fclose(fp) 在 for 循環內部,導致第二次迭代時文件已關閉,讀取失敗。FILE *fp = fopen("shuju.txt", "w"); // 文本寫入
if (!fp) { perror("打開失敗"); exit(1); }
for (int i = 0; i < N; i++) {
fprintf(fp, "%d %s %d %d %d %d\n",
stu[i].num, stu[i].name,
stu[i].score[0], stu[i].score[1],
stu[i].score[2], stu[i].score[3]);
}
fclose(fp);
// 讀取
fp = fopen("shuju.txt", "r");
if (!fp) { perror("打開失敗"); exit(1); }
for (int i = 0; i < N; i++) {
fscanf(fp, "%d %s %d %d %d %d",
&stu[i].num, stu[i].name,
&stu[i].score[0], &stu[i].score[1],
&stu[i].score[2], &stu[i].score[3]);
printf("%d\t%s\t%d\t%d\t%d\t%d\n",
stu[i].num, stu[i].name,
stu[i].score[0], stu[i].score[1],
stu[i].score[2], stu[i].score[3]);
}
fclose(fp);
"wb"/"rb"。#pragma pack(1) 禁用對齊填充,跨平台時需考慮字節序。文本模式下,確保源文件編碼(如 UTF-8)與終端/編輯器一致,fprintf 即可正常寫入中文;二進制模式同樣可存儲,但需統一編碼約定。
總結:教學/調試階段優先用文本模式(fprintf/fscanf),可見、可編輯、易調試;生產環境大數據量時再考慮二進制優化。