首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C 語言文件操作詳解(二):fopen 打開模式與文本/二進制差異深度解析

     編輯:C 語言入門

C 語言文件操作詳解(二):fopen 打開模式與文本/二進制差異深度解析

文件操作的第一步是 fopen,本文詳細解析打開模式組合、路徑處理、以及 Windows 下文本/二進制模式的關鍵差異(換行符轉換)。

fopen 原型與參數

FILE* fopen(const char *path, const char *mode);
  • path:相對路徑預設為項目目錄;絕對路徑需轉義反斜槠 "C:\\test.txt"
  • mode:由 r/w/a/+ /b/t 組合而成

常見模式組合速查表

模式含義文件必須存在指針初始位置清空內容
r只讀是文件頭否
r+讀寫是文件頭否
w只寫否(不存在則創建)文件頭是
w+讀寫否文件頭是
a追加只寫否文件頭*否
a+追加讀寫否文件頭*否

* 關鍵發現:追加模式打開後指針初始指向文件頭,只有執行寫操作時才會移至末尾(驗證代碼見下)。

文本 vs 二進制模式核心差異(Windows)

文本模式(默認 t):

  • 寫入 '\n' (0x0A) → 自動轉為 '\r\n' (0x0D 0x0A)
  • 讀取 '\r\n' → 自動轉為 '\n'

二進制模式(b):

  • 不做任何轉換,原始字節流

Unix/Linux 無差異(只有 '\n')。

實驗驗證代碼

// 1. 驗證追加模式指針初始位置
FILE *fp = fopen("test.txt", "a");  // 假設文件已有 "ABC"
printf("%d\n", ftell(fp));  // 輸出 0(文件頭)
fputs("test", fp);
printf("%d\n", ftell(fp));  // 輸出 7(寫入後位置)

// 2. 驗證換行符轉換
char s[] = {'A','B','\n','C'};
FILE *fp1 = fopen("test1.txt", "wt");  // 文本
FILE *fp2 = fopen("test2.txt", "wb");  // 二進制
for (int i=0; i<4; i++) {
    fputc(s[i], fp1);
    fputc(s[i], fp2);
}
// 用十六進制編輯器查看:
// test1.txt: 41 42 0D 0A 43  (多出 0D)
// test2.txt: 41 42 0A 43     (原始)

// 3. 讀取時的差異
// 文本讀取 test1.txt: 41 42 0A 43 (自動過濾 0D)
// 二進制讀取 test1.txt: 41 42 0D 0A 43 (保留 0D)

網絡編程/跨平台血淚教訓

「公司項目曾因未區分文本/二進制模式,導致 Windows 寫入配置文件後 Linux 讀取解析失敗,排查耗時數日。務必顯式指定 'b' 模式處理二進制數據,文本協議明確約定換行符格式。」

最佳實踐建議

  1. 二進制數據(圖片、結構體、壓縮包):必須用 "wb"/"rb"/"wb+"
  2. 文本文件(配置、日誌、源碼):可用默認文本模式,但跨平台建議統一 '\n' 作為換行
  3. 追加日誌:使用 "a"/"a+",記住指針初始在頭部
  4. 需隨機讀寫:優先 "rb+"/"wb+",配合 fseek/ftell

掌握 fopen 模式組合與文本/二進制語義差異,是 C 語言文件處理穩健性的基石。

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