当前,在打印程序中的任何内容之前,我要做的第一件事是运行setbuf(stdout, _IOFBF);
但是printf("hello\n");
仍将刷新缓冲区。
这很糟糕,我想控制何时发送所有文本(以在终端中创建带有“ ASCII”文本的“平滑”动画gif体验)。
如何告诉我的程序我希望stdout
得到完全缓冲?
答案 0 :(得分:3)
您不能通过以下方式使用setbuf
:setbuf(stdout, _IOFBF);
。第二个参数是指向BUFSIZ
个字节数组的指针。
在执行任何输出之前,您应该使用setvbuf()
且缓冲区大小可能更大:
setvbuf(stdout, NULL, _IOFBF, 4096);
您可以传递实际的数组而不是NULL
,但这不是必需的,因为setvbuf
将分配缓冲区,如果您不分配缓冲区,则可能会这样做。您可能要检查返回值以确保调用成功。如果由于某种意外原因此调用在您的系统上失败,则输出将不会被完全缓冲。
这是C标准定义:
7.21.5.6
setvbuf
功能简介
#include <stdio.h> int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size);
setvbuf
函数只能在stream
指向的流已与打开的文件相关联之后且在任何其他操作之前(对setvbuf
的调用失败除外)才能使用。在流上执行。参数mode
确定如何stream
进行缓冲,如下所示:_IOFBF
使输入/输出被完全缓冲;_IOLBF
使输入/输出被行缓冲;_IONBF
导致输入/输出未缓冲。如果buf
不是空指针,则可以使用它指向的数组代替setvbuf
函数分配的缓冲区,而参数size
指定数组的大小;否则,size
可以确定setvbuf
函数分配的缓冲区的大小。数组中的内容随时都是不确定的。返回
setvbuf
函数成功返回零,如果为mode
给出了无效值或不能满足该请求,则返回非零。
答案 1 :(得分:0)
您需要使用setvbuf
来设置缓冲模式,大小和位置:
buffer = malloc(1024);
setvbuf(stdout, buffer, _IOFBF, 1024);
如果要完全控制刷新,则需要确保缓冲区足够大,以至于由于容量原因它永远不会刷新。