FILE* fopen(const char* path, const char* mode);
path:相對路徑(專案目錄)或絕對路徑(Windows 需轉義 \\)mode:由 r w a + b t 六字元組合| 字元 | 含義 | ||||
|---|---|---|---|---|---|
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)
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(原樣)。
\n/\r 被竄改導致資料損壞。"wb" 保留原始換行格式,接收端按協議解析。a/a+ 模式:讀操作從頭,寫操作自動到尾,不要假設指標在尾部而直接 fread。"C:\\data\\file.txt" 或 "C:/data/file.txt"。