setvbuf
函数 <cstdio>
int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
改变流缓冲
指定流的缓冲区。该函数允许指定缓冲区的模式和大小(以字节为单位)。
如果buffer是空指针,函数会自动分配一个缓冲区(使用size作为使用大小的提示)。
否则,buffer所指向的数组可能被用作大小为字节的缓冲区。
一旦流与打开的文件相关联,但在对该文件执行任何输入或输出操作之前,应该调用此函数。
流缓冲区的数据块,充当中介之间的i / o操作和相关的物理文件流:
输出缓冲区,数据输出缓冲区,直到其达到最大容量,然后刷新
(例如:所有数据发送到物理文件,缓冲了)。同样,输入缓冲区由物理文件填充,
数据从物理文件发送到操作,直到耗尽,此时从文件获取新数据以再次填充缓冲区。
可以通过调用
fflush显式刷新流缓冲区。
它们也会被
fclose和
freopen自动刷新,
或者在程序正常终止时自动刷新。
如果已知所有文件没有引用交互设备,那么它们将使用默认分配的缓冲区(完全缓冲)打开。
此函数可用于重新定义缓冲区大小或模式,定义用户分配的缓冲区或禁用流的缓冲。
如果已知缺省流
stdin和
stdout没有引用交互设备,则默认完全缓存它们。否则,
根据系统和库的实现,默认情况下,它们可能是行缓冲的或非缓冲的。对于
stderr也是如此,
默认情况下它总是被行缓冲或未缓冲。
☲ 参数
stream
指向标识打开流的
FILE对象的指针。
buffer
用户分配的缓冲区。长度至少为size字节。
如果设置为空指针,函数将自动分配一个缓冲区。
mode
指定文件缓冲模式。在<cstdio> 中定义了三个特殊的宏常量(_IOFBF, _IOLBF和_IONBF),用作这个参数的值:
_IOFBF |
完全缓冲 : 在输出时,一旦缓冲区满了(或刷新),就写入数据。
在Input上,当请求一个输入操作且缓冲区为空时,缓冲区将被填充。
|
_IOLBF |
行缓冲 : 输出时,在流中插入换行字符或缓冲区满(或刷新)时写入数据,
无论先发生什么。在Input上,当请求输入操作时,缓冲区为空,
缓冲区将被填满到下一个换行符。
|
_IONBF |
无缓存 : 不使用缓存。每次I/O操作都尽可能快地写入。在这种情况下,buffer和size参数被忽略。 |
size
缓冲区大小,以字节为单位。
如果buffer参数是空指针,则该值可能决定函数自动为缓冲区分配的大小。
☉ 返回值
如果缓冲区被正确地分配给文件,则返回一个零值。
否则,返回一个非零值;
这可能是由于无效的模式参数或其他分配或分配缓冲区的错误。
☣ 示例
/* 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字节的缓冲区被填满时,才应该将输出到该流的数据写入文件。
🍄 另请参阅