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 的種類
buf != NULL:buffer 會是 line buffered 或是 fully buffered (由 C library 決定)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 的