当前位置: C语言 -- 标准库 -- <stdio.h> -- setvbuf

setvbuf函数


概要:
#include <stdio.h>
int setvbuf(FILE * restrict stream,
     char * restrict buf,
     int mode, size_t size);

描述:

流缓冲是输入输出操作和物理文件之间起中介作用的数据块;以输出缓冲为例,数据先传输到缓冲,当缓冲填满后再进行刷新,将数据输出到物理文件。

setvbuf函数可以设置参数stream指向流的缓冲;应在流和打开的文件关联后,并且未进行任何操作(失败的setvbuf函数调用除外)前调用setvbuf函数。

如果参数buf不是空指针,参数buf指向的数组用作参数stream指向流的缓冲;如果参数buf是空指针,setvbuf函数为参数stream指向的流分配缓冲。参数size指定数组的大小;否则参数size可用于指定setvbuf函数分配的缓冲大小。缓冲的生存期(lifetime)应至少和打开的流一样长,因此在块退出时释放具有自动存储期限的缓冲前不关闭流会导致未定义行为。

流缓冲可以使用fflush函数显式刷新。当调用fclosefreopen函数或者程序正常终止(:这里程序正常终止是指main函数返回给宿主环境或者调用exit函数终止程序。)时也会自动刷新缓冲。


参数:
FILE * restrict stream

FILE类型指针,指向一个打开的流。

char * restrict buf

指向缓冲的指针。

int mode

缓冲模式。

ISO/IEC 9899:2018标准<stdio.h>头文件定义了三种缓冲模式,具体如下:

缓冲模式 英文解释 描述
_IOFBF fully buffered 全缓冲:字符会被累积;当缓冲填满后,缓冲内的字符作为块传输。
_IOLBF line buffered 行缓冲:字符会被累积;当缓冲填满后或者遇到换行符时,缓冲内的字符作为块传输。
_IONBF unbuffered 无缓冲:字符会被尽快地传输。
size_t size

字节形式表示的缓冲大小。


返回值:

如果调用成功,函数返回0;如果参数mode是无效值,或者如果请求不能得到满足,函数返回一个非0值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
/*函数setvbuf范例*/

#include <stdio.h>

int main(void)
{
    char buffer[BUFSIZ];
    FILE *pFileOne;
    FILE *pFileTwo;

    /*创建第一个文件。*/
    pFileOne = fopen("fileOne.txt", "w");
    if(pFileOne)
    {
        if(setvbuf(pFileOne, buffer, _IOFBF, BUFSIZ) == 0)
            fputs("The start is what stops most people.", pFileOne);
    }
    fclose(pFileOne);

    /*创建第二个文件。*/
    pFileTwo = fopen("fileTwo.txt", "w");
    if(pFileTwo)
    {
        if(setvbuf(pFileTwo, NULL, _IONBF, 0) == 0)
            fputs("The start is what stops most people.", pFileTwo);
    }
    fclose(pFileTwo);

    return 0;
}


结果:

创建两个内容均为"The start is what stops most people."的文件;其中pFileOne是全缓冲的,数组buffer用作缓冲,而pFileTwo是无缓冲的。


相关内容:
BUFSIZ 表示缓冲大小的宏。
setbuf 设置流缓冲的函数。