| 特性 | fprintf | fwrite |
|---|---|---|
| 檔案類型 | 文字檔(格式化) | 二進位檔(原始位元組) |
| 寫入內容 | 格式化字串(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'
fread 對應 fwrite(二進位讀取)。fscanf 對應 fprintf(格式化讀取)。fprintf 將資料序列化為文字,空間隨數值大小變動;fwrite 直接傾印記憶體位元組,空間固定等於型別大小。根據「人類可讀 vs 機器高效」選擇適當 API。