如何将标准输出设置为在C中完全缓冲?

如何将标准输出设置为在C中完全缓冲?,c,C,目前,在打印程序中的任何内容之前,我要做的第一件事是运行setbuf(stdout,_IOFBF) 但是printf(“hello\n”)仍将刷新缓冲区 这很糟糕,我想控制它何时发送所有文本(为了在终端中使用ascii文本创建“平滑”的动画gif体验) 如何告诉我的程序我希望stdout完全缓冲?您需要使用setvbuf设置缓冲模式、大小和位置: buffer = malloc(1024); setvbuf(stdout, buffer, _IOFBF, 1024); 如果你想完全控制刷新,你

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

但是
printf(“hello\n”)仍将刷新缓冲区

这很糟糕,我想控制它何时发送所有文本(为了在终端中使用ascii文本创建“平滑”的动画gif体验)


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

您需要使用
setvbuf
设置缓冲模式、大小和位置:

buffer = malloc(1024);
setvbuf(stdout, buffer, _IOFBF, 1024);

如果你想完全控制刷新,你需要确保你的缓冲区足够大,它永远不会因为容量而刷新。

你不能这样使用
setbuf
setbuf(stdout,\u 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);
#包括
int setvbuf(文件*限制流,
字符*restrict buf,int模式,size\u t size);
setvbuf
功能只能在
stream
指向的流与打开的文件关联后,以及在流上执行任何其他操作(调用
setvbuf
失败除外)之前使用。参数
mode
确定如何缓冲
流,如下所示:
\u IOFBF
使输入/输出完全缓冲<代码>\u IOLBF
导致输入/输出被行缓冲<代码>\u IONBF
使输入/输出无缓冲。如果
buf
不是空指针,则可以使用它指向的数组而不是
setvbuf
函数分配的缓冲区,参数
size
指定数组的大小;否则,
size
可以确定由
setvbuf
函数分配的缓冲区大小。数组的内容在任何时候都是不确定的

返回

    #include <stdio.h>
    int setvbuf(FILE * restrict stream,
                char * restrict buf, int mode, size_t size);
setvbuf
函数在成功时返回零,如果为
模式
提供的值无效或请求无法满足,则返回非零


您可以自己缓冲它:构建一个2D数组,它表示整个新“帧”,并一次输出所有帧。如果可以先将光标定位到左上角,速度会更快,因为控制台不必滚动。如何从程序中将光标定位到左上角?我相信这是一个很受欢迎的库。在Windows中,我使用。@jkaldfjk:您可以通过单击分数下面的灰色复选标记来接受其中一个答案