文件指針與打開模式
`FILE *fp = fopen("path", "mode");` 模式字符串:
| 模式 | 含義 |
| r | 只讀,文件必須存在 |
| w | 只寫,截斷/創建 |
| a | 追加,創建 |
| r+ | 讀寫,文件必須存在 |
| w+ | 讀寫,截斷/創建 |
| a+ | 讀寫追加 |
| b | 二進制(如 `rb` `wb`) |
核心函數
- `fclose(fp)`:關閉,刷新緩衝區,釋放結構體。
- `fgetc`/`fputc`:字符讀寫。
- `fgets`/`fputs`:行讀寫(`fgets` 保留 `\n`,安全替代 `gets`)。
- `fread(ptr, size, count, fp)` / `fwrite`:二進制塊讀寫,返回實際項數。
- `fprintf`/`fscanf`:格式化文件 I/O。
- `fseek(fp, offset, origin)`:移動位置指針。`origin`:`SEEK_SET`(0) `SEEK_CUR`(1) `SEEK_END`(2)。
- `ftell(fp)`:返回當前偏移量。
- `rewind(fp)`:等價 `fseek(fp,0,SEEK_SET)`。
- `feof(fp)`/`ferror(fp)`:檢測結束/錯誤。
文本 vs 二進制
- 文本模式:Windows 換行 `\r\n` ↔ `\n` 轉換,可能改變字節數。
- 二進制模式:字節流原樣讀寫,跨平台一致,適合結構體/圖片/數據庫。
常見錯誤
- 未檢查 `fopen` 返回 NULL 直接操作 → 段錯誤。
- 讀寫模式不匹配(`r` 打開寫入)。
- 結構體含指針直接 `fwrite` → 指針值無意義,需序列化。
- 忘記 `fclose` 導致資源洩漏、數據未刷新。
總結
標準 I/O 庫提供緩衝、格式化、隨機訪問完整功能,掌握模式選擇、錯誤檢查、二進制序列化、位置控制,即可實現健壯的文件持久化邏輯。