FILE *fopen(const char *path, const char *mode);
| 模式 | 說明 | 檔案必須存在 | 截斷/清空 | 讀/寫 |
|---|---|---|---|---|
r | 唯讀開啟文字檔 | 是 | 否 | 讀 |
r+ | 讀寫開啟文字檔 | 是 | 否 | 讀/寫 |
w | 唯寫開啟文字檔 | 否(不存在則建立) | 是(長度歸零) | 寫 |
w+ | 讀寫開啟文字檔 | 否 | 是 | 讀/寫 |
a | 附加模式唯寫文字檔 | 否 | 否(寫入位置在檔尾) | 寫 |
a+ | 附加模式讀寫文字檔 | 否 | 否 | 讀/寫 |
rb | 唯讀二進制檔 | 是 | 否 | 讀 |
wb | 唯寫二進制檔 | 否 | 是 | 寫 |
ab | 附加唯寫二進制檔 | 否 | 否 | 寫 |
rb+/r+b | 讀寫二進制檔 | 是 | 否 | 讀/寫 |
wb+/w+b | 讀寫二進制檔(截斷) | 否 | 是 | 讀/寫 |
ab+/a+b | 附加讀寫二進制檔 | 否 | 否 | 讀/寫 |
註:b 表示二進制模式,無 b 預設文字模式(t)。Windows 下文字模式會自動轉換 \n ↔ \r\n;Linux 無差異。
FILE* 指標。NULL,並設定 errno。#include <stdio.h>
#include <stdlib.h>
#define F_PATH "d:/myfile/file.dat"
int main(void)
{
FILE *fp = NULL; // 1. 初始化為 NULL
fp = fopen(F_PATH, "r");
if (fp == NULL) {
perror("fopen"); // 印出系統錯誤訊息
return -1;
}
// ... 檔案操作 ...
fclose(fp); // 2. 關閉檔案
fp = NULL; // 3. 指標歸零,防止游離指標
return 0;
}
FILE *fp = NULL;fclose(fp);fp = NULL;違反任一鐵律皆可能導致資源洩漏、游離指標、重複關閉崩潰。
FILE *fp1 = fopen("a.txt", "r");
FILE *fp2 = fopen("b.txt", "w+");
if (fp1) { fclose(fp1); fp1 = NULL; }
if (fp2) { fclose(fp2); fp2 = NULL; }
// 關閉所有開啟檔案(MSVC 擴展)
int closed = _fcloseall();
printf("Closed %d files\n", closed);
// Windows
fputs("line\n", fp_text); // 實際寫入 \"line\r\n\"
fputs("line\n", fp_bin); // 實際寫入 \"line\n\"
// Linux
// 兩者皆寫入 \"line\n\"
跨平台處理二進制資料(圖片、序列化結構體)必須加 b。
fopen 回傳值 → 後續操作 NULL 崩潰。ENOENT。w 模式誤以為會保留舊內容 → 實際會截斷。fflush/fclose 會刷新)。