非常教程

C参考手册

文件输入/输出 | File input/output

setvbuf

在头文件<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以来)

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

  • 如果buffer是空指针,则调整内部缓冲区的大小size
  • 如果buffer不是空指针,则指示流使用用户提供的大小size开始的缓冲区buffer。流必须fclose在数组生命周期buffer结束之前关闭(with )。成功调用数组后的内容setvbuf是不确定的,并且任何尝试使用它都是未定义的行为。

参数

-

用于设置缓冲区的文件流或空指针仅用于更改大小和模式

缓冲

-

指向要使用的流的缓冲区

模式

-

缓冲模式使用。它可以是以下值之一:_IOFBF完全缓冲_IOLBF行缓冲_IONBF无缓冲

_IOFBF

完全缓冲

_IOLBF

行缓冲

_IONBF

没有缓冲

_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通常会提供更好的估计。

改变缓冲区大小的一个用例是知道更好的大小。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
 
int main(void)
{
    FILE* fp = fopen("test.txt", "r");
    if(fp == NULL) {
       perror("fopen"); return 1;
    }
 
    struct stat stats;
    if(fstat(fileno(fp), &stats) == -1) { // POSIX only
        perror("fstat"); return 1;
    }
 
    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 1;
    }
 
    int ch;
    while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to
                                  // observe the read(2) syscalls used
 
    fclose(fp);
}

可能的输出:

BUFSIZ is 8192, but optimal block size is 65536

参考

  • C11标准(ISO / IEC 9899:2011):
    • 7.21.5.6 setvbuf函数(p:308)
  • C99标准(ISO / IEC 9899:1999):
    • 7.19.5.6 setvbuf函数(p:273-274)
  • C89 / C90标准(ISO / IEC 9899:1990):
    • 4.9.5.6 setvbuf函数
C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。