?
This document uses PHP Chinese website manual Release
在頭文件<stdio.h>中定義 | ||
---|---|---|
int setvbuf(FILE * stream,char * buffer,int mode,size_t size); | (直到C99) | |
int setvbuf(FILE * restrict stream,char * restrict buffer,int mode,size_t size); | (自C99以來) |
stream
如參數(shù)所示,更改給定文件流的緩沖模式mode
。此外,
如果buffer
是空指針,則調(diào)整內(nèi)部緩沖區(qū)的大小size
。
如果buffer
不是空指針,則指示流使用用戶提供的大小size
開始的緩沖區(qū)buffer
。流必須fclose
在數(shù)組生命周期buffer
結(jié)束之前關(guān)閉(with )。成功調(diào)用數(shù)組后的內(nèi)容setvbuf
是不確定的,并且任何嘗試使用它都是未定義的行為。
流 | - | 用于設(shè)置緩沖區(qū)的文件流或空指針僅用于更改大小和模式 | ||||||
---|---|---|---|---|---|---|---|---|
緩沖 | - | 指向要使用的流的緩沖區(qū) | ||||||
模式 | - | 緩沖模式使用。它可以是以下值之一:_IOFBF完全緩沖_IOLBF行緩沖_IONBF無緩沖 | _IOFBF | 完全緩沖 | _IOLBF | 行緩沖 | _IONBF | 沒有緩沖 |
_IOFBF | 完全緩沖 | |||||||
_IOLBF | 行緩沖 | |||||||
_IONBF | 沒有緩沖 | |||||||
size | - | 緩沖區(qū)的大小 |
0
失敗時成功或非零。
此功能可后方可使用stream
已經(jīng)以開放的文件相關(guān)聯(lián),但任何其他操作之前(除了一個失敗的呼叫setbuf
/ setvbuf
)。
并非所有size
字節(jié)都必須用于緩沖:實際的緩沖區(qū)大小通常被舍入為2的倍數(shù),頁面大小的倍數(shù)等。
在許多實現(xiàn)中,行緩沖僅適用于終端輸入流。
一個常見的錯誤是將stdin或stdout的緩沖區(qū)設(shè)置為在程序終止之前其生命周期結(jié)束的數(shù)組:
int main(void) { char buf[BUFSIZ]; setbuf(stdin, buf);} // lifetime of buf ends, undefined behavior
默認(rèn)緩沖區(qū)大小BUFSIZ
預(yù)計是實現(xiàn)上文件I / O的最有效緩沖區(qū)大小,但POSIX fstat通常會提供更好的估計。
改變緩沖區(qū)大小的一個用例是知道更好的大小。
#include <stdio.h>#include <stdlib.h>#include <sys/stat.h> int main(void){ FILE* fp = fopen("test.txt", "r"); if(fp == NULL) { perror("fopen"); return 1; } struct stat stats; if(fstat(fileno(fp), &stats) == -1) { // POSIX only perror("fstat"); return 1; } printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize); if(setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0) { perror("setvbuf failed"); // POSIX version sets errno return 1; } int ch; while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to // observe the read(2) syscalls used fclose(fp);}
可能的輸出:
BUFSIZ is 8192, but optimal block size is 65536
C11標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.21.5.6 setvbuf函數(shù)(p:308)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.19.5.6 setvbuf函數(shù)(p:273-274)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
4.9.5.6 setvbuf函數(shù)