如何设置stdout在C中完全缓冲?

时间:2019-03-17 19:37:38

标签: c

当前,在打印程序中的任何内容之前,我要做的第一件事是运行setbuf(stdout, _IOFBF);

但是printf("hello\n");仍将刷新缓冲区。

这很糟糕,我想控制何时发送所有文本(以在终端中创建带有“ ASCII”文本的“平滑”动画gif体验)。

如何告诉我的程序我希望stdout得到完全缓冲?

2 个答案:

答案 0 :(得分:3)

您不能通过以下方式使用setbufsetbuf(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);

如果要完全控制刷新,则需要确保缓冲区足够大,以至于由于容量原因它永远不会刷新。