| 操作 | Linux/Unix (unistd.h) | Windows (io.h) |
| 打開 | open(path, flags, mode) | _open(path, flags, mode) |
| 讀取 | read(fd, buf, count) | _read(fd, buf, count) |
| 寫入 | write(fd, buf, count) | _write(fd, buf, count) |
| 關閉 | close(fd) | _close(fd) |
| 定位 | lseek(fd, offset, whence) | _lseek(fd, offset, whence) |
特點:返回文件描述符 int fd,無用戶態緩衝,直接進內核,效能最高但編程複雜。
第二層:標準庫二進制流 (塊緩衝、stdio.h)
FILE *fp = fopen("data.bin", "rb"); // 二進制讀
fread(buf, size, count, fp); // 讀取 count 個 size 字節塊
fwrite(buf, size, count, fp); // 寫入
fseek(fp, offset, SEEK_SET); // 定位
fclose(fp);
特點:FILE* 封裝緩衝區,適合結構體數組、圖像、音訊等二進制數據批量讀寫。
第三層:標準庫格式化流 (行/全緩衝、stdio.h)
FILE *fp = fopen("data.txt", "r"); // 文本讀
fscanf(fp, "%d %s %f", &n, str, &f); // 格式化讀
fprintf(fp, "%d %s %.2f\n", n, str, f); // 格式化寫
fgets(line, sizeof(line), fp); // 讀整行
fputs(line, fp); // 寫字串
fclose(fp);
特點:人類可讀文本,適合配置文件、日誌、CSV、數據交換。
選擇指南
| 場景 | 推薦層次 | 理由 |
| 高效能大量二進制數據 | 系統調用 / fread/fwrite | 零拷貝/最小開銷 |
| 結構體數組持久化 | fread/fwrite | 一次讀寫整個結構體 |
| 配置文件/文本日誌 | fscanf/fprintf/fgets | 可讀、可編輯、跨語言 |
| 跨平台通用代碼 | 標準庫 (fopen 系) | ISO C 標準,無平台差異 |
| 需精確控制文件鎖/權限 | 系統調用 | fcntl/flock/LockFileEx |
最佳實踐
- 總是檢查返回值:
if (!fp) { perror("open"); return -1; }
- 二進制模式加
b:"rb" "wb" 避免換行符轉換
- 大文件用
fseek / ftell 配合 long 或 fgetpos/fsetpos (支援 64 位)
- 關鍵數據寫入後
fflush(fp) 或 fsync(fd) 落盤
- 上一篇文章: C語言教材推薦:譚浩強《C程序設計》經典入門首選
- 下一篇文章: C語言綜合考試題庫:選擇、填空、編程完整解析
Copyright ©
程式碼之家 All Rights Reserved