setvbuf
來自 cppreference.com
定義於標頭檔案 <stdio.h> |
||
(直到 C99) | ||
(C99 起) | ||
#define _IOFBF /*未指定*/ #define _IOLBF /*未指定*/ |
||
按照引數 mode
所指示,更改給定檔案流 stream
的緩衝模式。此外,
- 若
buffer
為空指標,則重設內部緩衝區大小為size
。 - 若
buffer
非空指標,則指示流使用使用者提供的、始於buffer
的size
大小的緩衝區。在buffer
所指向的陣列的生存期結束前,必須用 fclose 關閉該流。成功呼叫setvbuf
後,陣列的內容是不確定的,任何對它的使用都是未定義行為。
目錄 |
[編輯] 引數
stream | - | 要設定緩衝區的檔案流 | ||||||
buffer | - | 指向要供流使用的緩衝區的指標,或者為空指標以只更改大小和模式 | ||||||
mode | - | 要使用的緩衝模式。它可以是下列值之一
| ||||||
size | - | 緩衝區大小 |
[編輯] 返回值
成功時為 0,失敗時為非零值。
[編輯] 注意
此函式只可在 stream
已被關聯到開啟的檔案後,但在任何其他操作(除了對 setbuf/setvbuf
的失敗呼叫)前使用。
並非所有 size
位元組都必然用於緩衝:實際緩衝區大小通常會向下取整為 2 的倍數、頁大小的倍數等。
在許多實現中,行緩衝僅對終端輸入流可用。
一個常見的錯誤是將 stdin 或 stdout 的緩衝區設定為一個數組,而該陣列的生存期在程式終止前結束。
預設緩衝區大小 BUFSIZ 預期是實現上檔案 I/O 最有效的緩衝區大小,但 POSIX fstat 通常能提供更好的估計。
[編輯] 示例
更改緩衝區大小的一個用例是當已知一個更好的大小時。(此示例使用了一些 POSIX 函式,例如 fileno
。另見 SO: #1 和 #2)。
執行此程式碼
// Make some POSIX functions, such as `int fileno(FILE*)`, visible: #define _POSIX_SOURCE #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(void) { FILE* fp = fopen("/tmp/test.txt", "w+"); if (fp == NULL) { perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { perror("fstat"); return EXIT_FAILURE; } 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 EXIT_FAILURE; } int ch; while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to // observe the read(2) syscalls used fclose(fp); return EXIT_SUCCESS; }
可能的輸出
BUFSIZ is 8192, but optimal block size is 65536
[編輯] 引用
- C17 標準 (ISO/IEC 9899:2018)
- 7.21.5.6 The setvbuf function (p: 225)
- C11 標準 (ISO/IEC 9899:2011)
- 7.21.5.6 The setvbuf function (p: 308)
- C99 標準 (ISO/IEC 9899:1999)
- 7.19.5.6 The setvbuf function (p: 273-274)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 4.9.5.6 The setvbuf function
[編輯] 參閱
為檔案流設定緩衝區 (函式) | |
C++ 文件中關於setvbuf的內容
|