在C中清除标准输出?

时间:2014-03-21 19:23:49

标签: c stdout

有没有办法清除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),但都没有。

5 个答案:

答案 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);