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

C/C++ 文件讀寫常用函數:fread/fwrite 底層封裝 vs fscanf/fprintf 格式化

     編輯:程式設計綜合問答

兩大流派對比

維度fread/fwrite (二進制塊)fscanf/fprintf (格式化文本)
適用場景結構體數組、圖片、序列化、高性能、跨平台二進制配置文件、日志、CSV、人類可讀、調試友好
優點速度快、體積小、精確控制字節、無格式解析開銷可讀性強、支持格式化字符串、易調試、人工編輯
缺點不可讀、端序/對齊/版本兼容需自行處理、指針/動態內存不可直接寫解析慢、空間大、格式字符串易出錯、浮點精度損失
典型用法fwrite(buf, size, count, fp)fprintf(fp, "%d %s\n", id, name)

大廠實踐建議

  • 底層統一用 fread/fwrite 封裝通用 I/O 層:提供 readInt(), writeString(), readStruct() 等接口,上層業務調用封裝層。
  • 文本配置/日志用 fprintf/fscanf 或成熟庫:如 cJSON, yaml-cpp, spdlog,別手寫解析器。
  • C++ 推薦 iostream (fmtlib) 或 memory_map:std::ofstream 類型安全、可擴展;大文件用 mmap/boost::iostreams::mapped_file。

封裝示例(C 風格)

// 寫入字符串:先寫長度,再寫內容
void writeString(FILE *fp, const char *s) {
    uint32_t len = strlen(s);
    fwrite(&len, 4, 1, fp);
    fwrite(s, 1, len, fp);
}

// 讀取字符串
char *readString(FILE *fp) {
    uint32_t len;
    fread(&len, 4, 1, fp);
    char *s = malloc(len + 1);
    fread(s, 1, len, fp);
    s[len] = '\0';
    return s;
}

總結

**大牛不糾結單一函數,而是構建分層 I/O 抽象**:底層 fread/fwrite 保性能、控字節;中層封裝類型序列化;上層業務調用高級 API。文本場景直接用成熟庫。工程化核心是「封裝」而非「選函數」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved