文件操作核心流程
C 語言文件操作標準三步驟:打開 → 讀寫 → 關閉。打開建立文件關聯,關閉釋放資源並刷新緩衝區,兩者缺一不可。
fopen - 打開文件
FILE *fopen(const char *filename, const char *mode);
filename:文件名含路徑(Windows 用雙反斜杠 \\ 或正斜杠 /)
mode:打開模式字符串
- 成功返回
FILE*(文件指針),失敗返回 NULL
FILE 結構體:stdio.h 中定義,包含文件名、狀態、位置指針、緩衝區等信息。用戶不直接操作結構體,只通過指針傳遞。
打開模式完整對照表
| 模式 | 說明 | 文件必須存在 | 清空內容 | 可讀 | 可寫 | 二進制 |
| r | 只讀 | 是 | 否 | ✓ | ✗ | ✗ |
| r+ | 讀寫 | 是 | 否 | ✓ | ✓ | ✗ |
| w | 只寫 | 否 | 是 | ✗ | ✓ | ✗ |
| w+ | 讀寫 | 否 | 是 | ✓ | ✓ | ✗ |
| a | 追加寫 | 否 | 否 | ✗ | ✓ | ✗ |
| a+ | 追加讀寫 | 否 | 否 | ✓ | ✓ | ✗ |
| rb / rb+ / wb / wb+ / ab / ab+ | 對應二進制版本 | - | - | - | - | ✓ |
| rt+ / wt+ / at+ | 顯式文本讀寫 | - | - | - | - | ✗ |
模式字符組合規則
模式由 r/w/a(基礎操作)+ b/t(文件類型,默認 t)+ +(讀寫雙向)組成:
r (read):讀,文件必須存在
w (write):寫,不存在創建,存在清空
a (append):追加,不存在創建,存在保留內容
b (binary):二進制文件,無轉換
t (text):文本文件,換行符轉換(可省略)
+:讀寫雙向
標準錯誤處理模式
FILE *fp = fopen("D:\\demo.txt", "rb");
if (fp == NULL) {
printf("Error: Cannot open file D:\\demo.txt\n");
// perror("fopen"); // 系統錯誤信息
return 1;
}
// ... 文件操作 ...
fclose(fp);
fclose - 關閉文件
int fclose(FILE *fp);
- 刷新緩衝區(寫模式下確保數據落盤)
- 釋放
FILE 結構體、文件描述符等系統資源
- 成功返回 0,失敗返回
EOF
- 程序正常結束時系統會自動關閉所有文件,但最好顯式調用
標準流(無需打開直接使用)
| 流 | 對應設備 | 常用函數 |
| stdin | 鍵盤(標準輸入) | scanf, getchar, fgets |
| stdout | 顯示器(標準輸出) | printf, putchar, puts |
| stderr | 顯示器(標準錯誤) | perror, fprintf(stderr,...) |
可用 freopen 重定向標準流,實現輸出重定向到文件。
文本 vs 二進制模式關鍵差異
| 特性 | 文本模式 | 二進制模式 |
| 換行符 | Windows: \r\n ↔ \n 轉換 | 保持原樣 |
| EOF 處理 | 可能將 Ctrl+Z 視為 EOF | 無特殊處理 |
| 性能 | 稍慢(轉換開銷) | 快(直接拷貝) |
| 適用場景 | 文本文件、配置、日誌 | 圖片、音視頻、結構體、跨平台數據 |
最佳實踐清單
- 打開後立即檢查 NULL
- 二進制數據必須用 "b" 模式
- 用完必須 fclose
- 路徑用
\\ 或 /,避免轉義陷阱
- 關鍵數據寫入後可調用
fflush(fp) 強制刷新
- 上一篇文章: C語言字符流文件讀寫詳解:fgetc 與 fputc 完全指南
- 下一篇文章: C語言文件概述:文件流、標準流與 IO 模型基礎
Copyright ©
程式碼之家 All Rights Reserved