函数
<cstdio>

setvbuf

int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
更改流的缓冲
stream指定一个buffer。该函数允许指定缓冲区的模式大小(以字节为单位)。

如果buffer为null指针,则函数会自动分配一个缓冲区(使用size作为缓冲区大小的提示)。否则,buffer指向的数组可用作一个大小为size字节的缓冲区。

此函数应在stream与打开的文件关联后、但在对其进行任何输入或输出操作之前调用。

流缓冲区是数据块,充当 I/O 操作和与流关联的物理文件之间的中介:对于输出缓冲区,数据被写入缓冲区直到达到其最大容量,然后将其刷新(即:所有数据一次性发送到物理文件并清空缓冲区)。同样,输入缓冲区从物理文件中填充,数据从缓冲区发送到操作,直到耗尽,此时从文件中获取新数据以再次填充缓冲区。

流缓冲区可以通过调用fflush显式刷新。它们也会被fclosefreopen自动刷新,或者在程序正常终止时被刷新。

所有文件都默认分配了缓冲区(全缓冲),前提是它们不指向交互式设备。此函数可用于重新定义缓冲区大小模式,定义用户分配的缓冲区,或禁用流的缓冲。

默认情况下,标准流stdinstdout如果是全缓冲的,并且已知不指向交互式设备。否则,它们可能根据系统和库的实现,默认是行缓冲无缓冲。对于stderr也是如此,它总是默认是行缓冲无缓冲


参数

stream
指向一个FILE对象,该对象标识一个已打开的流。
buffer
用户分配的缓冲区。至少应有size字节长。
如果设置为null指针,则函数会自动分配缓冲区。
mode
指定文件缓冲模式。三个特殊的宏常量(_IOFBF, _IOLBF_IONBF)在<cstdio>中定义,用作此参数的值
_IOFBF全缓冲:输出时,一旦缓冲区已满(或刷新),数据就会被写入。输入时,当请求输入操作且缓冲区为空时,缓冲区将被填充。
_IOLBF行缓冲:输出时,当向流中插入一个换行符或缓冲区已满(或刷新)时,数据就会被写入,以先发生的为准。输入时,当请求输入操作且缓冲区为空时,缓冲区会被填充直到下一个换行符。
_IONBF无缓冲:不使用缓冲区。每个 I/O 操作会尽快写入。在这种情况下,buffersize参数将被忽略。
size
缓冲区大小,以字节为单位。
如果buffer参数是null指针,此值可能决定函数为缓冲区自动分配的大小。

返回值

如果缓冲区已成功分配给文件,则返回零。
否则,返回一个非零值;这可能是由于mode参数无效,或者由于分配或分配缓冲区时出现其他错误。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* setvbuf example */
#include <stdio.h>

int main ()
{
  FILE *pFile;

  pFile=fopen ("myfile.txt","w");

  setvbuf ( pFile , NULL , _IOFBF , 1024 );

  // File operations here

  fclose (pFile);

  return 0;
}

在此示例中,一个名为myfile.txt的文件被创建,并为关联的流请求了1024字节的全缓冲,因此输出到此流的数据应在每次1024字节缓冲区填满时才写入文件。

另见