在Linux中使用C++代码清除终端

48

好的,我一直在研究如何做到这一点。假设我运行的程序在终端上有很多输出,那么如何从我的程序内部清除屏幕,以便我可以让程序继续运行呢?

我知道我可以在终端中键入clear并且它可以正常清除,但是像我所说的,对于这个程序,使用其他方法会更有益。

我找到了一些可行的方案,但是我不确定它是什么或者它在做什么。

cout << "\033[2J\033[1;1H";

那个能用,但我不知道它是什么,如果你能解释一下的话,我会非常感激。

4个回答

69
这些是ANSI转义码。第一个代码(\033[2J)清除整个屏幕(J)从顶部到底部(2)。第二个代码(\033[1;1H)将光标定位在第1行,第1列。
所有的ANSI转义码都以序列ESC[开始,有零个或多个由;分隔的参数,并以命令字母结束(在这种情况下是JH)。\033是转义字符的C风格八进制序列。
详见此处获取完整信息。

14

不要依赖于特定的转义序列,因为它们可能在意想不到的情况下出现问题(尽管如果这是您想要的,接受这种权衡是可以的),您可以执行与在 shell 中执行的相同操作:

std::system("clear");

尽管一般来说应该避免使用 system(),但对于用户交互程序,额外的 shell 解析和进程开销并不重要。在这种情况下,也没有 shell 转义的问题。

如果您确实想要避免使用 system(),那么您始终可以 fork/exec 来调用 clear。如果您已经在使用 [n]curses 或其他终端库,请使用它。


1
TERM环境变量未设置。 - Martin Pfeffer
4
请注意,在C++中,您需要包含<cstdlib>才能使用std::system。此外,尽管在bash上使用"clear"可以生效,但在Windows命令行中,您需要使用"cls"。 - Mark Peschel
system()函数将会fork()一个进程,然后启动一个bash并运行命令。1)你必须避免使用system()函数;2)这并没有回答问题,因为问题要求提供C++代码而不是运行系统命令。 - reichhart
无论如何都不可移植,clear的作用完全相同。在某些情况下,您可能无法访问clear。 - Swift - Friday Pie

1

你可以在终端中输入"clear > data",并在data中读取转义序列

0x1B[H0x1B[2J0x1B[3J

因此

std::cout << "\033[H\033[2J\033[3J" ;

0
为了可移植性,您应该从termcap的cl(清除)功能(清除屏幕和光标主页)中获取字符串。 (或者按照Roger Pate的建议使用std :: system(“clear”))。
man 3 termcap(在ncurses中)
man 5 termcap
set | grep TERMCAP

我无法理解,你能给我解释一下吗? - Suraj Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接