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

C 語言 fopen 詳解:六大模式字元組合、指標初始位置實測與文本/二進制模式差異驗證

     編輯:關於C語言

fopen 原型與參數


FILE* fopen(const char* path, const char* mode);
  • path:相對路徑(專案目錄)或絕對路徑(Windows 需轉義 \\)
  • mode:由 r w a + b t 六字元組合

六大基礎模式字元語義

12 種常見組合模式完整語義表

字元含義
r唯讀,檔案必須存在
w唯寫,截斷現有檔案或建立新檔
a附加寫入,檔案不存在則建立
+讀寫雙向(配合 r/w/a)
b二進制模式
t文本模式(預設)
模式讀/寫檔案存在不存在指標初始位置備註
r唯讀開啟成功失敗 NULL檔頭
r+讀寫開啟成功失敗 NULL檔頭
rb+/r+b讀寫開啟成功失敗 NULL檔頭二進制
rt+/r+t讀寫開啟成功失敗 NULL檔頭文本
w唯寫截斷為 0建立新檔檔頭
w+讀寫截斷為 0建立新檔檔頭
a唯寫(附加)保留內容建立新檔檔頭寫入時移至尾部
a+讀寫(附加)保留內容建立新檔檔頭讀從頭,寫到尾

關鍵澄清:附加模式指標初始位置在檔頭,而非檔尾!

許多教材錯稱 a/a+ 打開後指標在檔尾。實測證明:ftell(fp) 返回 0。只有執行寫入操作(fputs、fwrite 等)時,系統才自動將指標移至檔尾再寫入。讀取操作(fgets、fread)從檔頭開始。

實測驗證程式碼


// 測試 a 模式初始指標位置
FILE* fp = fopen("test.txt", "a"); // 假設檔案含 "ABC"
printf("%d\n", ftell(fp)); // 輸出 0
fputs("test", fp);
printf("%d\n", ftell(fp)); // 輸出 7 (3+4)

文本 vs 二進制模式實測:換行符轉換


char s[] = {'A','B','\n','C'}; // 含 \n (0x0A)
FILE* fp1 = fopen("t1.txt", "wt"); // 文本
FILE* fp2 = fopen("t2.txt", "wb"); // 二進制
for (int i=0;i<4;i++) { fputc(s[i],fp1); fputc(s[i],fp2); }
fclose(fp1); fclose(fp2);

UltraEdit 二進制檢視結果:

  • t1.txt (文本寫入):41 42 0D 0A 43 → \n 變 \r\n (多 0x0D)
  • t2.txt (二進制寫入):41 42 0A 43 → 原樣保留

讀取驗證:以 rt 讀 t1.txt 得 41 42 0A 43(自動轉回 \n);以 rb 讀得 41 42 0D 0A 43(原樣)。

工程避坑指南

  1. 二進制資料(結構體、圖片、壓縮包)必須加 "b",否則 \n/\r 被竄改導致資料損壞。
  2. 跨平台傳輸文本檔:發送端用 "wb" 保留原始換行格式,接收端按協議解析。
  3. a/a+ 模式:讀操作從頭,寫操作自動到尾,不要假設指標在尾部而直接 fread。
  4. Windows 路徑字串:"C:\\data\\file.txt" 或 "C:/data/file.txt"。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved