有没有办法清除C中的标准输出缓冲区?
我有一个程序,我不知道在循环结束之前我是否要输出数据。
我想让我的逻辑像:
printf("data1\n");
printf("data2\n");
...
if (printTuple)
fflush(stdout); //Print the data to stdout
else
/*Clear stdout*/ //Clear stdout
我尝试了memset(stdout, 0, sizeof(stdout))
和rewind(stdout)
,但都没有。
答案 0 :(得分:3)
清除标准输出不是一种选择。相反,你必须避免在stdout上打印任何东西,直到你确定这是否是你想做的事情。如果您的程序足够简单,只需重新定位printf
语句即可完成。对于更复杂的程序,您需要一些中间存储的打印内容(要打印的值或实际字符串的内部缓冲区)。
答案 1 :(得分:2)
无法可靠地撤回已提交给printf()
和朋友的内容。但是,您可以使用open_memstream()
对您有利:它为您提供FILE*
,您可以{常规方式fprintf()
向您提供任何内容。但是,关闭使用FILE*
创建的open_memstream()
后,您将获得一个malloc<缓冲区,其中包含您打印到文件指针的整个文本。
用法如下:
char* buffer = NULL;
size_t bufferSize = 0;
FILE* myStream = open_memstream(&buffer, &bufferSize);
fprintf(myStream, "You can output anything to myStream, just as you can with stdout.\n");
myComplexPrintFunction(myStream); //Append something of completely unknown size.
fclose(myStream); //This will set buffer and bufferSize.
printf("I can do anything with the resulting string now. It is: \"%s\"\n", buffer);
free(buffer);
答案 2 :(得分:1)
在Linux上,您可以使用__fpurge,在某些Unices(BSD,Solaris,等)上,您可以使用fpurge,但这不能移植到其他平台,例如Windows。
#include <stdio.h>
#include <stdio_ext.h>
if (printTuple)
fflush(stdout); // Print the data to stdout
else
__fpurge(stdout); // Clear stdout
正如其他人已经指出的那样,你的整个方法充满了潜在的问题,你应该重新考虑你的设计。
答案 3 :(得分:1)
我无法得到我的评论的答案,但我认为,因为您使用fflush
进行打印,所以您似乎已将stdout
缓存。
在这种情况下,您必须将一些内存分配为缓冲区。该缓冲区应该是您应该设置为0
的内存,例如memset( stdout->_base, 0, stdout->_bufsiz )
,但这也不会起作用。
无论如何,如果我认为你的情况是这样的,那么我认为你想拥有以下一行:
stdout->_ptr = stdout->_base;
是的,就这么简单。
我不知道这是否是未定义的行为;这是我刚才检查FILE
结构时发现的东西。
答案 4 :(得分:-1)
在linux中,您可以使用'\033c'
代码清除标准输出
例如:fputs("\033c", stdout);