C++官网参考链接:https://cplusplus.com/reference/cstdio/setbuf/
函数
<cstdio>
setbuf
void setbuf ( FILE * stream, char * buffer );
设置流缓冲区
指定stream用于I/O操作的buffer,这将成为一个完全缓冲的stream。或者,如果buffer是空指针,则对stream禁用缓冲,使其成为无缓冲的stream。
一旦流与打开的文件相关联,但在对其执行任何输入或输出操作之前,应该调用此函数。
buffer的大小至少被假定为BUFSIZ字节(请参阅setvbuf以指定buffer的size)。
流缓冲区是作为I/O操作和与流相关的物理文件之间的中介的数据块:对于输出缓冲区,数据被输出到缓冲区,直到达到其最大容量,然后它被刷新(flushed)(即:所有数据被立即发送到物理文件和清除缓冲区)。同样,从物理文件填充输入缓冲区,然后将数据发送给操作,直到耗尽为止,这时从文件获取新数据再次填充输入缓冲区。
可以通过调用fflush显式刷新流缓冲区。它们也会被fclose和freopen自动刷新,或者在程序正常终止时自动刷新。
只要有足够的数据可用,完全缓冲的stream就使用buffer的整个大小作为缓冲区(有关其他缓冲模式,请参阅setvbuf)。
如果知道所有文件没有引用交互设备,则使用默认分配的缓冲区(完全缓冲)打开它们。这个函数可以用来设置一个特定的内存块用作buffer,或者禁用stream的缓冲。
默认流stdin和stdout在默认情况下是完全缓冲的,如果它们已知不引用交互设备。否则,它们可能默认为行缓冲或无缓冲,这取决于系统和库实现。stderr也是如此,默认情况下,它总是行缓冲或无缓冲。
对该函数的调用等价于以_IOFBF为mode,以BUFSIZ为size(当buffer不是空指针时)调用setvbuf,或者等价于以_IONBF为mode(当buffer是空指针时)调用它。
形参
stream
指向FILE对象的指针,该对象标识打开的流。
buffer
用户分配的缓冲区。至少BUFSIZ字节长。
或者,可以指定空指针来禁用缓冲。
返回值
没有返回值。
用例
/* 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相关联,被设置为无缓冲的,因此后续的输出操作将尽快写入设备。
然而,一旦文件被关闭(关闭文件将刷新其缓冲区),缓冲流和无缓冲流的最终状态是相同的。
输出: