名稱空間
變體
操作

std::setvbuf

來自 cppreference.com
< cpp‎ | io‎ | c
 
 
 
 
定義於標頭檔案 <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 - 使用的緩衝模式。它可以是以下值之一
_IOFBF 全緩衝
_IOLBF 行緩衝
_IONBF 無緩衝
size - 緩衝區大小

[編輯] 返回值

成功時返回 0,失敗時返回非零值。

[編輯] 注意

此函式只能在 stream 已與一個開啟的檔案關聯之後,但在任何其他操作之前(除了對 std::setbuf/std::setvbuf 的失敗呼叫)使用。

並非所有 size 位元組都必然用於緩衝:實際緩衝區大小通常向下舍入為 2 的倍數、頁面大小的倍數等。

在許多實現上,行緩衝僅適用於終端輸入流。

一個常見的錯誤是將 stdinstdout 的緩衝區設定為一個在程式終止之前其生命週期結束的陣列

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