好的,我一直在研究如何做到这一点,但是说我正在运行一个在终端上有一点输出的程序,我如何从我的程序中清除屏幕以便我可以保留我的程序运行
我知道我可以在终端输入clear
并清除它,但就像我说的那样,对于这个程序来说对我来说更有利。
我发现了一些有效的东西,但是,我不确定它是什么或它在做什么。
cout << "\033[2J\033[1;1H";
这有效,但我不知道它是什么,如果你能解释它,我会非常感激。
答案 0 :(得分:44)
这些是ANSI转义码。第一个(\033[2J
)从上到下(J
)清除整个屏幕(2
)。第二个代码(\033[1;1H
)将光标定位在行1
,列1
。
所有ANSI转义都以序列 ESC [开头,有零个或多个参数由; 分隔,并以命令字母结尾(在你的情况下, J 和 H 。 \033
是转义字符的C风格八进制序列。
有关完整的路演,请参阅here。
答案 1 :(得分:10)
不依赖于在意外情况下可能会破坏的特定转义序列(虽然接受权衡很好,如果它是你想要的),你可以在shell上做同样的事情:
std::system("clear");
虽然通常要避免使用system(),但对于用户交互式程序,额外的shell解析和进程开销都不重要。在这种情况下,shell转义也没有问题。
如果你想避免使用system(),你总是可以fork / exec来调用clear。如果您已经在使用[n] curses或其他终端库,请使用它。
答案 2 :(得分:0)
为了便于携带,你应该从termcap的cl(清除)功能中获取字符串(Clear screen和cursor home)。 (或者使用Roger Pate所说的std :: system(“clear”)。
男人3 termcap(在ncurses中)
man 5 termcap
设置| grep TERMCAP
答案 3 :(得分:0)
您可以在终端“清除>数据”中写入并读取转义序列的数据
0x1B[H0x1B[2J0x1B[3J]
所以
std::cout << "\033[H\033[2J\033[3J" ;