【问题标题】:Modifying text in the terminal在终端中修改文本
【发布时间】:2011-10-20 23:59:25
【问题描述】:

是否可以在不清除屏幕的情况下修改我打印到终端的文本?

例如,如果我以百分比显示某项进度,我是否可以修改该百分比而无需清除屏幕并再次打印?我正在寻找一种跨平台的方式,如果有的话。

会说话的 C++。

谢谢

【问题讨论】:

  • 使用回车(不换行)并覆盖该行
  • @knittl:取决于终端仿真。一些仿真在发送回车时执行换行。

标签: c++ linux terminal console-application


【解决方案1】:

有很多方法可以做到这一点,根据您想要投入多少精力,您可以在终端窗口中使用 ascii 文本做很多很酷的事情。

  1. 高级:ncurses library

  2. 更简单:ansi escape characters with printf or cout

  3. 最简单:正如其他人所说,只需使用\r 进行回车,无需换行。

编辑:使用 ESC 序列返回两个字符的示例:

#include <iostream>
#define ESC char(0x1B)

int main(){
  std::cout << "This will overwrite 'rs' in the following: characters" << ESC << "[2D" << "xx" << std::endl;
  return 0;
}

【讨论】:

  • ANSI 转义字符似乎可以满足我的需要。我将如何去左 2 个字符?像 std::cout
  • @MisterSir - 使用大写 D: std::cout &lt;&lt; "This will overwrite 'rs' in the following: characters" &lt;&lt; char(0x1B) &lt;&lt; "[2D" &lt;&lt; "xx" &lt;&lt; std::endl;
  • 不要硬编码 0x1B,但是,如果你能避免它,如果你想让它正常工作。您应该倾向于使用 ncurses(使用它来查找代码并不是很复杂)或 tput 程序(如果编写 shell 脚本)从 terminfo 数据库中查找适当的终端代码。
【解决方案2】:

一个非常简单的方法是打印一个字符串,后跟一个'\r'字符。那是回车本身,在大多数控制台上,它将光标返回到行首而不向下移动。这允许您覆盖当前行。

如果您正在写入 stdout 或 cout 或 clog,请记住 fflush 或 std::flush 流以使其立即输出该行。如果您正在写入 stderr 或 cerr,则流是无缓冲的,所有输出都是即时的(并且效率低下)。

一个更复杂的方法是使用像curses这样的屏幕绘图库。

【讨论】:

    【解决方案3】:

    在 Linux 系统上,查看 ncurses 包。该软件包支持大多数终端上的光标移动。

    【讨论】:

      【解决方案4】:

      您可以使用“\r”字符返回该行的第一个字符:

      for(int i = 0; i < 60; i++){ cout << "\rValue of i: " << i;}

      请记住,不要在输出的末尾添加结束行(endl 或 '\n'),否则每次都会跳到新行的开头,从而失去所需的效果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 2015-08-19
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多