C 標準庫提供流式文件 I/O 接口,核心是 FILE* 抽象。本文覆蓋打開模式、讀寫函數、錯誤處理、資源管理等實戰要點。
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *stream);
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
| 模式 | 含義 | 文件存在 | 文件不存在 | 定位 |
|---|---|---|---|---|
r | 只讀 | 打開 | 失敗返回 NULL | 開頭 |
w | 只寫 | 截斷為 0 | 創建 | 開頭 |
a | 追加寫 | 打開 | 創建 | 末尾 |
r+ | 讀寫 | 打開 | 失敗 | 開頭 |
w+ | 讀寫 | 截斷 | 創建 | 開頭 |
a+ | 讀寫追加 | 打開 | 創建 | 末尾 |
二進制模式在字母後加 b(如 rb, wb),Windows 下影響換行符轉換,Linux 無差異。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char line[80];
FILE *in = fopen("input.csv", "r");
FILE *out = fopen("output.csv", "a"); // 追加模式
if (!in || !out) {
perror("fopen failed");
return 1;
}
while (fscanf(in, "%79[^\n]\n", line) == 1) {
fprintf(out, "from input:%s\n", line);
}
fclose(in);
fclose(out);
return 0;
}
fopen 失敗返回 NULL,必須判斷並用 perror 輸出錯誤原因。fclose 刷新緩衝區、釋放文件描述符。進程最多打開有限文件(如 256/1024),長期運行必須關閉。stdout 通常行緩衝,文件流塊緩衝。fflush(fp) 強制刷新。fscanf 返回成功匹配項數,EOF 返回 EOF。%79[^\n] 讀取一行(不含換行),防止緩衝區溢出。fread/fwrite 處理結構體、圖片等非文本數據,避免文本模式下換行符轉換破壞數據。fgets 保留換行符,fscanf 配合 %[^\n] 不保留,需手動處理。a 多進程寫入安全(POSIX 保證原子追加),但需注意換行符一致性。fopen 路徑分隔符可用 \\ 或 /,建議統一用 / 跨平台。