setbuf, setvbuf

Function Prototype

void setbuf(FILE *fp, char *buf);
int setvbuf(FILE *fp, char *buf, int mode, size_t size);

Function

buffering 中,我們提到 stream 只有在第一次 I/O 時才會實際分配 buffer (malloc),但在那之前,我們實際上能使用這個筆記中介紹的兩個 function call 來手動分配 buffer

這兩個操作必須在 fopen 之後,任何 I/O 前,否則無效

Detail

setbuf

我們可以指定 fp 這個 buffered I/O stream 使用 buf 作為 buffer,但是我們無法指定 buffer 的大小或是 buffer 的種類

  1. buf != NULL:buffer 會是 line buffered 或是 fully buffered (由 C library 決定)
  2. buf == NULL:將這個 FILE object 設為 unbuffered

setvbuf

一句話概括就是:「可以指定 buffering type 和 buffer size 的 setbuf

  • 可以指定 type 為 _IOFBF, _IOLBF_IONBF
  • 可以指定 buffer size,最佳選擇為 disk 的 block size (可由 stat 取得),因為 disk I/O erase write 的單位為 block (SSD)
  • buffer size 是 NULL 就會由系統自行決定

就如 fclose 提到的,在使用這兩個函式時必須確認 buf 這個記憶體是否會在 fp 的 life cycle 中都是 valid 的