Namespaces
Variants

setvbuf

来自 zh.cppreference.net
< c | io
 
 
文件输入/输出
类型和对象
        
函数
文件访问
(C95)
无格式输入/输出
(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     /* unspecified */
#define _IOLBF     /* unspecified */
#define _IONBF     /* unspecified */

更改给定文件流 stream 的缓冲模式,由参数 mode 指定。此外,

  • 如果 buffer 是空指针,则将内部缓冲区大小调整为 size。
  • 如果 buffer 不是空指针,则指示流使用由用户提供的、大小为 size、起始于 buffer 的缓冲区。在 fclose 关闭流之前,所指向的数组的生存期buffer必须结束。成功调用 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

引用

  • C23 标准(ISO/IEC 9899:2024):
  • 7.21.5.6 setvbuf 函数(p: TBD)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.21.5.6 setvbuf 函数(p: 225)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.21.5.6 setvbuf 函数(p: 308)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.21.5.6 setvbuf 函数(p: 273-274)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.9.5.6 setvbuf 函数

参阅

为文件流设置缓冲区
(函数)
C++ 文档 关于 setvbuf