使用 C++ 代码在 Linux 中清除终端
Posted
技术标签:
【中文标题】使用 C++ 代码在 Linux 中清除终端【英文标题】:Clearing terminal in Linux with C++ code 【发布时间】:2011-05-03 00:00:37 【问题描述】:好的,我一直在研究如何做到这一点,但是假设我正在运行一个在终端上有大量输出的程序,我将如何从我的程序中清除屏幕,以便我可以保留我的程序跑步吗?
我知道我可以在终端中输入clear
并清除它,但就像我说的,对于这个程序,它对我更有利。
我发现了一些有用的东西,但是我不确定它是什么或它在做什么。
cout << "\033[2J\033[1;1H";
这行得通,但我不知道它是什么,如果你能解释一下,我将不胜感激。
【问题讨论】:
【参考方案1】:这些是 ANSI 转义码。第一个 (\033[2J
) 从上到下 (2
) 清除整个屏幕 (J
)。第二个代码(\033[1;1H
)将光标定位在行1
,列1
。
所有 ANSI 转义都以序列 ESC[ 开头,有零个或多个由 ; 分隔的参数,并以命令字母 ( J 和 H 在你的情况下)。 \033
是转义字符的 C 风格八进制序列。
查看here了解完整路演。
【讨论】:
【参考方案2】:不必依赖可能在意外情况下中断的特定转义序列(尽管接受这种权衡是可以的,如果它是你想要的),你可以做你在 shell 上做的同样的事情:
std::system("clear");
虽然通常要避免使用 system(),但对于用户交互程序来说,额外的 shell 解析和进程开销都不是很重要。在这种情况下,shell 转义也没有问题。
如果您确实想避免使用 system(),您可以随时 fork/exec 调用 clear。如果您已经在使用 [n]curses 或其他终端库,请使用它。
【讨论】:
TERM 环境变量未设置。 请注意,在 C++ 中,您需要#include <cstdlib>
才能使用 std::system。此外,虽然“clear”适用于 bash,但对于 Windows 命令行,您需要“cls”。
system() 将 fork(),然后启动 bash,然后运行命令。 1) 你必须避免 system() 和 2) 这并没有回答它被要求提供 C++ 代码的问题,而不是关于运行系统命令的问题。
无论如何都不能移植,clear 做同样的事情。在某些情况下,您可能无权清除。【参考方案3】:
为了可移植性,您应该从 termcap 的 cl(清除)功能(清除屏幕和光标主页)中获取字符串。 (或者按照 Roger Pate 的说法使用 std::system("clear"))。
man 3 termcap(在 ncurses 中) 男人 5 术语帽 设置 | grep TERMCAP
【讨论】:
我看不懂,能解释一下吗?【参考方案4】:您可以在终端中写入“清除 > 数据”并在数据中读取转义序列
0x1B[H0x1B[2J0x1B[3J
所以
std::cout << "\033[H\033[2J\033[3J" ;
【讨论】:
以上是关于使用 C++ 代码在 Linux 中清除终端的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Linux (redhat) 上通过 gdb 在 xterm 中使用 valgrind?