| 維度 | fread/fwrite (二進制塊) | fscanf/fprintf (格式化文本) |
|---|---|---|
| 適用場景 | 結構體數組、圖片、序列化、高性能、跨平台二進制 | 配置文件、日志、CSV、人類可讀、調試友好 |
| 優點 | 速度快、體積小、精確控制字節、無格式解析開銷 | 可讀性強、支持格式化字符串、易調試、人工編輯 |
| 缺點 | 不可讀、端序/對齊/版本兼容需自行處理、指針/動態內存不可直接寫 | 解析慢、空間大、格式字符串易出錯、浮點精度損失 |
| 典型用法 | fwrite(buf, size, count, fp) | fprintf(fp, "%d %s\n", id, name) |
readInt(), writeString(), readStruct() 等接口,上層業務調用封裝層。cJSON, yaml-cpp, spdlog,別手寫解析器。std::ofstream 類型安全、可擴展;大文件用 mmap/boost::iostreams::mapped_file。// 寫入字符串:先寫長度,再寫內容
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。文本場景直接用成熟庫。工程化核心是「封裝」而非「選函數」。