如何在终端中更新打印的消息而不重新打印(Linux)

ldo*_*dog 40 c++ linux terminal text

我想为我的终端应用程序创建一个进度条,它的工作方式如下:

 [XXXXXXX       ] 
Run Code Online (Sandbox Code Playgroud)

这将在过程完成之前提供剩余时间的可视指示.

我知道我可以通过将它们添加到字符串然后只是printf来打印越来越多的X,但这看起来像:

 [XXXXXXX       ] 
 [XXXXXXXX      ] 
 [XXXXXXXXX     ] 
 [XXXXXXXXXX    ] 
Run Code Online (Sandbox Code Playgroud)

或类似的东西(显然你可以玩间距.)但这在视觉上不美观.有没有办法用新文本更新终端中的打印文本而无需重新打印?这都是linux,c ++.

Mic*_*ker 45

尝试使用\r而不是\n在打印新的"版本"时使用.

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


KFr*_*Fro 11

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

NCURSES

  • 这听起来像个矫枉过正. (6认同)
  • 是的......当我们等待进度条时,可能会有一场PONG游戏正在进行.:d (3认同)

180*_*ION 7

像这样的东西:

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

偷偷摸摸的位是回车符"\ r",它使光标移动到行的开头而不会下到下一行.


Jer*_*fin 5

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

另一种可能性是使用退格字符 ("\b") 擦除一些空格,并仅覆盖这些空格。这有几个优点。首先,它显然避免了必须重新生成线路中的所有内容,这有时会带来轻微的痛苦(尽管这很不寻常)。其次,它可以避免在显示数据时遇到一些麻烦(例如)在您编写时缩小尺寸——例如,如果您显示从 100 到 0 的倒计时,\r您必须小心覆盖整个前一个长度,或者您的倒计时将从(例如)100 到 990(即,保持前一个“0”不变)。

但是请注意,虽然行内的退格符通常有效,但行首的退格符可能会也可能不会将光标/写入位置移回前一行。对于大多数实际用途,您只能在一行内移动。