一、三種緩衝模式
| 模式 | 觸發條件 | 典型場景 | 控制函數 |
| 全緩衝 | 緩衝區滿 | 磁盤文件 | fflush() 強制刷新 |
| 行緩衝 | 遇到換行符 | 終端設備 | setvbuf() 設置 |
| 無緩衝 | 每次調用即寫入 | stderr 標準錯誤 | 無需控制 |
二、文件打開模式詳解
FILE *fopen(const char *filename, const char *mode);
| mode | 含義 | 文件須存在 | 截斷文件 | 可讀可寫 |
| r | 只讀 | 是 | 否 | 否 |
| w | 只寫(新建) | 否 | 是 | 否 |
| a | 追加寫 | 否 | 否 | 否 |
| r+ | 讀寫 | 是 | 否 | 是 |
| w+ | 讀寫(新建) | 否 | 是 | 是 |
| a+ | 追加讀寫 | 否 | 否 | 是 |
關鍵規則:帶 + 的模式切換讀寫時,必須插入 fflush、fseek、fsetpos 或 rewind。
三、二進制 I/O 函數
size_t fread(void *buf, size_t size, size_t count, FILE *fp);
size_t fwrite(const void *buf, size_t size, size_t count, FILE *fp);
- 返回值:成功讀寫的對象個數(非字節數)
- 適用:結構體、數組等數據塊整體讀寫
- 限制:跨平台移植性差(字節序、對齊、浮點格式)
四、隨機訪問核心函數
long ftell(FILE *fp); // 獲取當前位置(相對文件頭字節數)
int fseek(FILE *fp, long offset, int origin); // 移動位置指針
int rewind(FILE *fp); // 等價 fseek(fp, 0, SEEK_SET)
| origin 常量 | 值 | 含義 |
| SEEK_SET | 0 | 文件開頭 |
| SEEK_CUR | 1 | 當前位置 |
| SEEK_END | 2 | 文件末尾 |
五、獲取文件大小標準範式
FILE *fs = fopen("C:\\1.txt", "r");
long length = 0;
fseek(fs, 0, SEEK_END); // 定位到末尾
length = ftell(fs); // 位置即為大小
rewind(fs); // 重置到開頭繼續讀寫
六、常見坑點避雷
- 文本 vs 二進制:Windows 下
"r" 會將 \r\n 轉為 \n,二進制模式需加 b(如 "rb")
- 異常終止:進程異常退出不保證緩衝區刷新,關鍵數據需及時
fflush
- fread/fwrite 返回值:檢查返回值是否等於
count,而非簡單判斷非零