函数
<cstdio>

setbuf

void setbuf ( FILE * stream, char * buffer );
设置流缓冲区
指定要用于 I/O 操作的所使用的缓冲区,使其成为一个全缓冲流。或者,如果缓冲区是一个空指针,则禁用该的缓冲,使其成为一个无缓冲流。

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

缓冲区的大小假定至少为 BUFSIZ 字节(请参阅 setvbuf 以指定缓冲区的大小)。

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

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

一个全缓冲流在有足够数据可用时,会使用整个缓冲区大小作为缓冲区(有关其他缓冲模式,请参阅 setvbuf)。

如果已知文件不指向交互式设备,则所有文件在打开时都会分配一个默认的缓冲区(全缓冲)。此函数可用于设置一个特定的内存块作为缓冲区,或禁用该流的缓冲。

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

调用此函数等效于使用以下参数调用 setvbuf_IOFBF作为 modeBUFSIZ 作为 size(当 buffer 不是空指针时),或者等效于使用以下参数调用它:_IONBF作为 mode(当 buffer 是空指针时)。

参数

stream
指向一个 FILE 对象的指针,该对象标识一个打开的流。
buffer
用户分配的缓冲区。长度应至少为 BUFSIZ 字节。
或者,可以指定一个空指针来禁用缓冲。

返回值

无。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* setbuf example */
#include <stdio.h>

int main ()
{
  char buffer[BUFSIZ];
  FILE *pFile1, *pFile2;

  pFile1=fopen ("myfile1.txt","w");
  pFile2=fopen ("myfile2.txt","a");

  setbuf ( pFile1 , buffer );
  fputs ("This is sent to a buffered stream",pFile1);
  fflush (pFile1);

  setbuf ( pFile2 , NULL );
  fputs ("This is sent to an unbuffered stream",pFile2);

  fclose (pFile1);
  fclose (pFile2);

  return 0;
}

在此示例中,打开了两个文件进行写入。与文件myfile1.txt关联的流被设置为用户分配的缓冲区;对其执行写入操作;数据在逻辑上是流的一部分,但在调用 fflush 函数之前尚未写入设备。
示例中的第二个缓冲区与文件myfile2.txt关联,被设置为无缓冲,因此后续的输出操作会尽快写入设备。
然而,一旦文件被关闭(关闭文件会刷新其缓冲区),无论是有缓冲还是无缓冲的流,最终状态都是相同的。

另见