名稱空間
變體
操作

setvbuf

來自 cppreference.com
< c‎ | io
 
 
檔案輸入/輸出
型別和物件
        
函式
檔案訪問
(C95)
setvbuf

非格式化輸入/輸出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化輸入
 
定義於標頭檔案 <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 起)
#define _IOFBF     /*未指定*/

#define _IOLBF     /*未指定*/

#define _IONBF     /*未指定*/

按照引數 mode 所指示,更改給定檔案流 stream 的緩衝模式。此外,

  • buffer 為空指標,則重設內部緩衝區大小為 size
  • buffer 非空指標,則指示流使用使用者提供的、始於 buffersize 大小的緩衝區。在 buffer 所指向的陣列的生存期結束前,必須用 fclose 關閉該流。成功呼叫 setvbuf 後,陣列的內容是不確定的,任何對它的使用都是未定義行為。

目錄

[編輯] 引數

stream - 要設定緩衝區的檔案流
buffer - 指向要供流使用的緩衝區的指標,或者為空指標以只更改大小和模式
mode - 要使用的緩衝模式。它可以是下列值之一
_IOFBF 全緩衝
_IOLBF 行緩衝
_IONBF 無緩衝
size - 緩衝區大小

[編輯] 返回值

成功時為 0,失敗時為非零值。

[編輯] 注意

此函式只可在 stream 已被關聯到開啟的檔案後,但在任何其他操作(除了對 setbuf/setvbuf 的失敗呼叫)前使用。

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

在許多實現中,行緩衝僅對終端輸入流可用。

一個常見的錯誤是將 stdin 或 stdout 的緩衝區設定為一個數組,而該陣列的生存期在程式終止前結束。

int main(void) {
    char buf[BUFSIZ];
    setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior

預設緩衝區大小 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的內容