文件操作四步曲
- 打開:
FILE *fp = fopen("路徑", "模式");
- 讀/寫:
fprintf 寫入、fscanf 讀取。
- 關閉:
fclose(fp); 強制刷新緩衝區至磁盤。
- 錯誤檢查:
fopen 失敗返回 NULL,必須判斷。
寫入文件完整示例
FILE *fp = fopen("/Users/yonghu/Desktop/ok.txt", "w"); // "w" 截斷/創建\
if (!fp) { perror("open failed"); return 1; }\
fprintf(fp, "hello,wo來了");\
fclose(fp);\
printf("文件寫入成功\\n");
讀取文件完整示例
FILE *fp = fopen("/Users/yonghu/Desktop/ok.txt", "r");\
if (!fp) { perror("open failed"); return 1; }\
char str[100];\
fscanf(fp, "%s", str); // 讀取一個單詞(遇空白停止)\
fclose(fp);\
printf("讀取文件內容:\\n %s", str);
關鍵模式對照表
| 模式 | 含義 | 文件不存在 | 文件存在 | 寫入位置 |
| r | 只讀 | 失敗 | 保留 | 開頭 |
| w | 只寫 | 創建 | 截斷(清空) | 開頭 |
| a | 追加寫 | 創建 | 保留 | 末尾 |
| r+ | 讀寫 | 失敗 | 保留 | 開頭 |
| w+ | 讀寫 | 創建 | 截斷 | 開頭 |
| a+ | 讀寫追加 | 創建 | 保留 | 末尾 |
緩衝區機制關鍵點
- 標準 I/O 為全緩衝(文件)或行緩衝(終端)。
fprintf 寫入用戶空間緩衝區,未滿 512B/4KB 時不寫入磁盤。
- 程序異常終止會導致緩衝區數據丟失,文件不完整。
- 只有
fclose 或 fflush 能強制落盤,保證數據完整性。
進階讀寫函數
| 類別 | 函數 | 用途 |
| 字符 | fgetc / fputc | 單字符讀寫 |
| 字符串 | fgets / fputs | 整行讀寫(含換行符處理) |
| 格式化 | fscanf / fprintf | 類 scanf/printf,針對文件流 |
| 二進制塊 | fread / fwrite | 結構體、數組批量讀寫 |
文件定位函數
rewind(fp):位置指針回文件開頭。
fseek(fp, offset, SEEK_SET/CUR/END):相對開頭/當前/末尾偏移。
ftell(fp):獲取當前偏移量(相對開頭)。
feof(fp):判斷是否到達文件末尾。
最佳實踐清單
- 打開後立即檢查 NULL。
- 使用
"rb"/"wb" 二進制模式避免換行符轉換(跨平台關鍵)。
- 關鍵數據寫入後調用
fflush(fp) 而非等待 fclose。
- 結構體二進制讀寫注意對齊填充、字節序、指針無效問題,首選文本/序列化格式(JSON/Protobuf)。
- 臨時文件用
tmpfile() 自動清理。
掌握 FILE* 流式操作模型,是 C 語言持久化存儲、配置讀取、日誌記錄、數據交換的基石技能。