如何在不重新打印的情况下更新terminal中的打印消息(Linux)

我想为我的terminal应用程序制作一个进度条,其工作原理如下:

[XXXXXXX ] 

这将给出一个视觉指示,说明在这个过程完成之前剩下多less时间。

我知道我可以通过将它们添加到string然后简单地printf,而打印越来越多的X,但是看起来像这样:

  [XXXXXXX ] [XXXXXXXX ] [XXXXXXXXX ] [XXXXXXXXXX ] 

或类似的东西(显然你可以玩间距)。但这不是视觉美学。 有没有办法用新文本更新terminal中的打印文本,而不需要重新打印? 这是所有在Linux下,C ++。

尝试使用\r而不是\n打印新的“版本”。

 for(int i=0;i<=100;++i) printf("\r[%3d%%]",i); printf("\n"); 

我会说像ncurses这样的库将被用于这样的事情。 curses有助于在屏幕上移动光标并绘制文本等。

NCURSES

像这样的东西:

 std::stringstream out; for (int i = 0; i< 10; i++) { out << "X"; cout << "\r" << "[" << out.str() << "]"; } 

鬼鬼祟祟的位是回车符“\ r”,导致光标移动到行的开始位置,而不下行到下一行。

其他人已经指出,你可以使用\r返回到当前行的开头,并覆盖整个行。

另一种可能是使用退格字符(“\ b”)擦除一些空格,并只覆盖那些空格。 这可以有几个好处。 首先,它显然避免了必须重新产生线上的一切,有时可能会有轻微的痛苦(尽pipe这是非常不寻常的)。 其次,它可以避免在显示数据时出现一些痛苦(例如,在您编写数据时)会缩小 – 例如,如果您显示的数值从100减less到0,则必须小心关于覆盖整个以前的长度,或者倒计数将从(例如)100到990(即,保持前面的“0”完好)。

但是,请注意,虽然行内的后退空间通常起作用,但行首的退格可能会将光标/写入位置移回到上一行。 对于大多数实际目的,您只能在一行内移动。

'\ r'将执行回车。 想象一下打印机在没有换行的情况下执行回车('\ n')。 这会将写入点返回到行首,然后在原始行上重新打印更新的状态。

这是一种不同的语言,但这个问题可能对你有帮助。 基本上,转义字符\ r(回车符,而不是\ n换行符)将您移回到当前打印行的开头,以便您可以覆盖已经打印的内容。

另一个select是一次只打印一个字符。 通常,stdout是行缓冲的,所以你需要调用fflush(stdout)

 for(int i = 0; i < 50; ++i) { putchar('X'); fflush(stdout); /* do some stuff here */ } putchar('\n'); 

但是这并没有很好的结束“]”表示完成。