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

C 語言文件操作:二進制讀寫導致文本亂碼的解決方案

     編輯:程式設計綜合問答

現象描述

使用 fwrite 以二進制模式("wb")寫入結構體數組到文件,再用文本編輯器打開顯示亂碼;嘗試讀取時將 fclose 放在循環內導致僅讀取第一條記錄。

根本原因

  1. 文件指針聲明錯誤:FILE fp; 應為 FILE *fp;,否則編譯報錯或運行異常。
  2. 二進制 vs 文本模式:fwrite/fread 按內存原樣寫入結構體(含填充字節、整數二進制表示),文本編輯器無法直接解讀,故顯示亂碼。
  3. 讀取循環中過早關閉文件: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),可見、可編輯、易調試;生產環境大數據量時再考慮二進制優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved