?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
在頭文件<stdio.h>中定義 | ||
---|---|---|
void setbuf(FILE * stream,char * buffer); | (直到C99) | |
void setbuf(FILE * restrict stream,char * restrict buffer); | (自C99以來) |
設(shè)置內(nèi)部緩沖區(qū)以用于流操作。它應(yīng)該至少是BUFSIZ
字符長。
如果buffer
不為null,則相當(dāng)于setvbuf(stream, buffer,
_IOFBF,
BUFSIZ)
。
如果buffer
為空,相當(dāng)于setvbuf(stream,
NULL,
_IONBF, 0)
關(guān)閉緩沖。
流 | - | 要設(shè)置緩沖區(qū)的文件流 |
---|---|---|
緩沖 | - | 指向要使用的流的緩沖區(qū)。如果提供NULL,則關(guān)閉緩沖 |
沒有。
如果BUFSIZ
不是合適的緩沖區(qū)大小,setvbuf
可以用來改變它。
setvbuf
也應(yīng)該用來檢測錯誤,因為setbuf
不表示成功或失敗。
此功能可后方可使用stream
已經(jīng)以開放的文件相關(guān)聯(lián),但任何其他操作之前(除了一個失敗的呼叫setbuf
/ setvbuf
)。
一個常見的錯誤是將stdin或stdout的緩沖區(qū)設(shè)置為在程序終止之前其生命周期結(jié)束的數(shù)組:
int main(void) { char buf[BUFSIZ]; setbuf(stdin, buf);} // lifetime of buf ends, undefined behavior
可以使用setbuf在需要立即輸出的流上禁用緩沖。
#include <stdio.h>#include <threads.h> int main(void){ setbuf(stdout, NULL); // unbuffered stdout putchar('a'); // 'a' appears immediately if stdout is unbuffered thrd_sleep(&(struct timespec){.tv_sec=1}, NULL); // sleep 1 sec putchar('b'); }
輸出:
ab
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.21.5.5 setbuf函數(shù)(p:307-308)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.19.5.5 setbuf函數(shù)(p:273)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
4.9.5.5 setbuf函數(shù)