使用 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[ 开头,有零个或多个由 ; 分隔的参数,并以命令字母 ( JH 在你的情况下)。 \033 是转义字符的 C 风格八进制序列。

查看here了解完整路演。

【讨论】:

【参考方案2】:

不必依赖可能在意外情况下中断的特定转义序列(尽管接受这种权衡是可以的,如果它是你想要的),你可以做你在 shell 上做的同样的事情:

std::system("clear");

虽然通常要避免使用 system(),但对于用户交互程序来说,额外的 shell 解析和进程开销都不是很重要。在这种情况下,shell 转义也没有问题。

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

【讨论】:

TERM 环境变量未设置。 请注意,在 C++ 中,您需要 #include &lt;cstdlib&gt; 才能使用 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 中清除终端的主要内容,如果未能解决你的问题,请参考以下文章

用于输出的 Visual Studio 代码 C++ 终端

如何在linux/ubuntu下编写c++网络通信代码

如何在 Linux (redhat) 上通过 gdb 在 xterm 中使用 valgrind?

我使用过的Linux命令之clear - 清除终端屏幕,不是cls

LINUX终端可以使用reset清除所有输出

清除终端程序 Linux C/C++ 的输出