修改终端中的文本

时间:2011-08-05 15:42:35

标签: c++ linux terminal console-application

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

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

Talking C ++。

感谢

4 个答案:

答案 0 :(得分:5)

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

  1. 高级:ncurses library

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

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

  4. 编辑:使用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;
    }
    

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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