
在 C 語言的標準輸入輸出庫(stdio.h)中,緩沖區是連接程式與外部設備(如鍵盤、螢幕、檔案)的關鍵中介。它的存在極大地提升了 I/O 效率,減少了系統呼叫的開銷。根據資料處理的觸發時機,緩沖機制主要分為三類:無緩衝、全緩衝與行緩衝。
無緩衝模式下,資料不經暫存區,直接在產生或請求的瞬間進行傳輸。這適用於即時互動性強的場景,例如:
標準錯誤流(stderr)通常預設為無緩衝,確保錯誤訊息能第一時間顯示,不至於卡在緩衝區中導致除錯困難。
全緩衡模式下,資料會先累積在固定大小的緩衝區中,只有當緩衝區完全填滿時,才會一次性寫入目的地(如磁碟檔案)。
這是檔案 I/O 的預設模式,因為磁碟以區塊為單位讀寫效率最高。你可以透過 setvbuf() 或 setbuf() 自訂緩衝區大小或關閉緩衝。
行緩衝是介於前兩者之間的折衷方案:緩衝區遇到換行符(\n)時自動刷新。
fflush()printf 輸出帶換行符時即時顯示// 強制刷新輸出緩衝區,確保訊息立即顯示
printf("處理中...");
fflush(stdout);
// 設定檔案指標為無緩衝(適合記錄檔)
setvbuf(fp, NULL, _IONBF, 0);
// 設定自訂大小的全緩衝
char buf[8192];
setvbuf(fp, buf, _IOFBF, sizeof(buf));
理解緩沖機制對於解決「為什麼我的 printf 沒顯示?」、「為什麼檔案寫入的資料不全?」等經典問題至關重要。合理運用 fflush()、setvbuf() 以及區分 stderr/stdout 的預設行為,能讓你的 C 程式在 I/O 行為上更可預期、更健壯。