首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言文件讀寫三大層次:系統調用、標準庫二進制、格式化IO

     編輯:C 語言問答

文件操作三層抽象

第一層:系統調用 (無緩衝、底層、POSIX/Windows API)

特點:返回文件描述符 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、數據交換。

選擇指南

操作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)

最佳實踐

  • 總是檢查返回值:if (!fp) { perror("open"); return -1; }
  • 二進制模式加 b:"rb" "wb" 避免換行符轉換
  • 大文件用 fseek / ftell 配合 long 或 fgetpos/fsetpos (支援 64 位)
  • 關鍵數據寫入後 fflush(fp) 或 fsync(fd) 落盤
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦層次理由
高效能大量二進制數據系統調用 / fread/fwrite零拷貝/最小開銷
結構體數組持久化fread/fwrite一次讀寫整個結構體
配置文件/文本日誌fscanf/fprintf/fgets可讀、可編輯、跨語言
跨平台通用代碼標準庫 (fopen 系)ISO C 標準,無平台差異
需精確控制文件鎖/權限系統調用fcntl/flock/LockFileEx