在 Windows 平台進行 C/C++ 開發時,文件 I/O 是繞不開的基本功。本文系統梳理三種主流方式:**C 運行時庫 (CRT) `fxxx` 函數族**、**標準 C++ `fstream` 流庫**、以及 **Windows API (`CreateFile`/`ReadFile`/`WriteFile`)****,並重點對比前兩者的用法、性能與適用場景,助你根據項目需求做出最優技術選型。
定義於 `
| 函數 | 功能 | 典型用途 |
|---|---|---|
| `fopen` | 打開文件,返回 `FILE*` | 指定模式:`r`/`w`/`a`/`r+`/`w+`/`a+`,二進制加 `b`,編碼加 `ccs=ENCODING` |
| `fread`/`fwrite` | 二進制塊讀寫 | 高性能數據傳輸,參數:緩衝區、元素大小、個數、流指針 |
| `fgetc`/`fgets`/`fputc`/`fputs` | 文本行/字符讀寫 | 處理文本文件,自動處理換行符轉換 |
| `fclose` | 關閉流,刷新緩衝區 | 必須調用,否則數據丟失 |
| `feof`/`ferror` | 狀態檢查 | 區分文件結束與讀取錯誤 |
// 典型組合示例
FILE *fp = fopen("data.bin", "rb+"); // 二進制讀寫,文件必須存在
FILE *fp = fopen("log.txt", "a+, ccs=UTF-8"); // 追加讀寫,指定 UTF-8 編碼 (需 VS2013+)
注意:`fread`/`fwrite` 返回實際讀寫元素個數,而非字節數;二進制模式下無換行符轉換,跨平台數據交換必須加 `b` 标志。
定義於 `
ofstream out("config.txt");
out << "server_ip=" << "192.168.1.1" << '\n'
<< "port=" << 8080 << std::endl; // 類型安全,自動格式化
ifstream in("config.txt");
string key; int val;
while (in >> key >> val) { /* 解析 */ } // 自動跳過空白字符
| 标志 | 含義 | 備註 |
|---|---|---|
| `ios::in` / `ios::out` | 讀/寫模式 | 基礎標志 |
| `ios::binary` | 二進制模式 | 禁用 `\n`↔`\r\n` 轉換,**跨平台二進制必加** |
| `ios::app` | 追加寫入 | 隱含 `ios::out`,每次寫入前定位到末尾 |
| `ios::ate` | 打開後定位末尾 | 不隱含輸出模式,可配合讀模式查看文件大小 |
| `ios::trunc` | 截斷文件 | `ofstream` 默認行為 |
void WriteLog(const string& msg) {
ofstream log("app.log", ios::app | ios::binary); // 構造即打開
if (!log) throw runtime_error("Open log failed");
log << msg << '\n';
// 析構自動 close() 並刷新,即使拋出異常也安全
}
需要跨平台 (Linux/macOS/Windows)?
├─ 是 → 嚴格要求 C 接口? → CRT (stdio.h)
│ └─ 否 → 現代 C++ 項目? → fstream /
└─ 否 (純 Windows) →
├─ 高性能/異步/設備 I/O → Windows API (CreateFile, ReadFile, WriteFile, OVERLAPPED)
├─ 系統級/驅動開發 → Windows API / Kernel API (ZwCreateFile)
└─ 應用層業務邏輯 → fstream (推薦) 或 CRT
**CRT** 是跨平台基石,適合 C 項目、嵌入式、極致性能場景;**`fstream`** 是現代 C++ 應用層首選,類型安全、RAII 自動管理、代碼清晰;**Windows API** 則是系統級、高性能、異步 I/O 的終極武器。實際工程中,**分層封裝** 是關鍵:底層用平台 API 實現高性能 I/O 引擎,上層暴露 C++ 流式介面供業務邏輯使用,兼得性能與開發效率。