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