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

C 語言 fprintf 與 fwrite 差異深度解析:文字 vs 二進制寫入

     編輯:關於C語言

核心差異一覽

特性fprintffwrite
檔案類型文字檔(格式化)二進位檔(原始位元組)
寫入內容格式化字串(ASCII 碼)記憶體原始位元組拷貝
大小固定性視數值大小而定固定等於 sizeof(type)
可讀性人類可直接閱讀需特定程式解讀
跨平台性佳(文字標準)需注意位序/對齊

程式碼對比實測

// 共同輸入:1 2 3 4 5 6 7 8 9 0
int buffer[10];

// 代碼 1:fprintf
for (i=0; i<10; i++) fprintf(fp, "%d", buffer[i]);
// 檔案大小:10 位元組(每個數字 1 字元)

// 代碼 2:fwrite
for (i=0; i<10; i++) fwrite(&buffer[i], sizeof(int), 1, fp);
// 檔案大小:40 位元組(每個 int 4 位元組)

不同數值範圍的檔案大小對比

輸入資料fprintf 大小fwrite 大小
1~9, 0(10 個 1 位數)10 位元組40 位元組
100~110(10 個 3 位數)30 位元組40 位元組
10000~11000(10 個 5 位數)50 位元組40 位元組

結論:小數值 fprintf 省空間;大數值 fwrite 固定大小更划算。

底層儲存差異範例

int v = 1;
fwrite(&v, sizeof(int), 1, f);   // 寫入 4 位元組:0x01 0x00 0x00 0x00 (小端序)
fprintf(f, "%d", v);             // 寫入 1 位元組:0x31 ('1' 的 ASCII)

int v2 = 0x12345678;
fwrite(&v2, 4, 1, f);            // 4 位元組:0x78 0x56 0x34 0x12
fprintf(f, "%x", v2);            // 8 位元組:'1','2','3','4','5','6','7','8'
fprintf(f, "%d", v2);            // 9 位元組:'3','0','5','4','1','9','8','9','6'

選擇指南

  • fprintf:設定檔、日誌、需人工閱讀、跨語言解析、數值較小。
  • fwrite:高效能資料儲存、大量數值陣列、二進位格式、固定記錄大小、自定二進位協定。

補充:fread/fscanf 對應關係

  • fread 對應 fwrite(二進位讀取)。
  • fscanf 對應 fprintf(格式化讀取)。

總結

fprintf 將資料序列化為文字,空間隨數值大小變動;fwrite 直接傾印記憶體位元組,空間固定等於型別大小。根據「人類可讀 vs 機器高效」選擇適當 API。

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