【问题标题】:How remove displayed text from stdout?如何从标准输出中删除显示的文本?
【发布时间】:2016-01-28 10:00:00
【问题描述】:

我创建了一个显示文本的宏,然后刷新标准输出。问题是如果文本比新文本更长,如何强制清除旧的打印文本。

示例:如果我尝试打印一个包含 50 个字符的字符串,然后我需要覆盖所有文本并用 25 个字符重写文本。我总是打印第一个文本的一部分,因为第二个更短。

另外我需要在每行末尾插入\r,如何在我的宏中添加?

#include <stdio.h>
#include <string.h>
// I need to add "\r" to macro instead of to add it for all string
#define MESSAGE( fmt, args...) \
    do { setbuf(stdout, NULL); fprintf(stdout, fmt, ## args); fflush(stdout); sleep(5); } while (0)

int main()
{
    MESSAGE( "the application is started successfully\r");
    MESSAGE( "the application will be stopped soon\r");
    MESSAGE( "app stopped: ok\n\r");
    return 0;
}

结果:

./test2
app stopped: ok will be stopped soonlly

预期结果:

./test2
app stopped: ok

【问题讨论】:

  • 1) 使用标准 C __VA_ARGS__,而不是旧的 gcc 扩展。 2) 使用函数!
  • 要添加\r,只需添加另一个fprintf(stdout,"\r");fputc('\r',stdout);
  • VT100 转义序列 \x1b[2K(擦除光标所在的行)可能有用,具体取决于您的 shell 或终端。
  • @MikeCAT:谢谢,我已经解决了\x1b[2K的问题

标签: c stdout fflush


【解决方案1】:

这是解决方案:

#include <stdio.h>
#include <string.h>

#define MESSAGE( fmt, args...) \
    do { fprintf(stdout, fmt, ## args); fprintf(stdout, "\r"); fflush(stdout); sleep(1); fprintf(stdout, "\x1b[2K"); } while (0)

int main()
{
    MESSAGE( "the application is started successfully");
    MESSAGE( "the application will be stopped soon");
    MESSAGE( "app stopped: ok");
    return 0;
}

【讨论】:

  • 你如何确保stdout实际上一个终端理解你的控制序列?我强烈建议使用类似的东西,例如curses 如果您想要普通文本流之外的任何内容。
  • 在某些操作系统上(我认为 MAC 是一个例子)'\r' 也会导致终端滚动到下一行
猜你喜欢
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多