是否可以在不清除屏幕的情况下修改我打印到终端的文本?
例如,如果我以百分比显示某些内容的进度,是否可以修改该百分比而无需清除屏幕并再次打印?我正在寻找一种跨平台的方式,如果有的话。
Talking C ++。
感谢
答案 0 :(得分:5)
有很多方法可以做到这一点,根据您想要投入多少精力,您可以在终端窗口中使用ascii文本做很多很酷的事情。
最简单:正如其他人所说的那样,只需使用\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;
}
答案 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'),否则每次都会跳到新行的开头,从而失去预期效果。