std::setvbuf
來自 cppreference.com
定義於標頭檔案 <cstdio> |
||
int setvbuf( std::FILE* stream, char* buffer, int mode, std::size_t size ); |
||
根據引數 mode 的指示,改變給定檔案流 stream 的緩衝模式。此外,
- 如果 buffer 是空指標,則將內部緩衝區大小調整為 size。
- 如果 buffer 不是空指標,則指示流使用從 buffer 開始的、大小為 size 的使用者提供緩衝區。流必須在 buffer 所指向陣列的生存期結束前關閉(使用 std::fclose)。成功呼叫 std::setvbuf 後,陣列的內容是不確定的,任何嘗試使用它的行為都是未定義的。
目錄 |
[編輯] 引數
stream | - | 要設定緩衝區的檔案流 | ||||||
buffer | - | 指向流使用的緩衝區的指標,或為空指標以僅改變大小和模式 | ||||||
mode | - | 使用的緩衝模式。它可以是以下值之一
| ||||||
size | - | 緩衝區大小 |
[編輯] 返回值
成功時返回 0,失敗時返回非零值。
[編輯] 注意
此函式只能在 stream 已與一個開啟的檔案關聯之後,但在任何其他操作之前(除了對 std::setbuf/std::setvbuf
的失敗呼叫)使用。
並非所有 size 位元組都必然用於緩衝:實際緩衝區大小通常向下舍入為 2 的倍數、頁面大小的倍數等。
在許多實現上,行緩衝僅適用於終端輸入流。
一個常見的錯誤是將 stdin
或 stdout
的緩衝區設定為一個在程式終止之前其生命週期結束的陣列
int main() { char buf[BUFSIZ]; std::setbuf(stdin, buf); } // lifetime of buf ends, undefined behavior
預設緩衝區大小 BUFSIZ 預計是實現上檔案 I/O 最有效的緩衝區大小,但 POSIX fstat
通常提供更好的估計。
[編輯] 示例
改變緩衝區大小的一個用例是已知更好的大小時。
執行此程式碼
#include <cstdio> #include <cstdlib> #include <iostream> #include <sys/stat.h> int main() { std::FILE* fp = std::fopen("/tmp/test.txt", "w+"); if (!fp) { std::perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { std::perror("fstat"); return EXIT_FAILURE; } std::cout << "BUFSIZ is " << BUFSIZ << ", but optimal block size is " << stats.st_blksize << '\n'; if (std::setvbuf(fp, nullptr, _IOFBF, stats.st_blksize) != 0) { std::perror("setvbuf failed"); // POSIX version sets errno return EXIT_FAILURE; } // Read entire file: use truss/strace to observe the read(2) syscalls used for (int ch; (ch = std::fgetc(fp)) != EOF;) {} std::fclose(fp); return EXIT_SUCCESS; }
可能的輸出
BUFSIZ is 8192, but optimal block size is 65536
[編輯] 另請參閱
為檔案流設定緩衝區 (函式) | |
[虛擬函式] |
提供使用者提供的緩衝區或將此檔案緩衝區設為無緩衝 ( std::basic_filebuf<CharT,Traits> 的虛保護成員函式) |
C 文件 用於 setvbuf
|