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

Posted

技术标签:

【中文标题】清除终端程序 Linux C/C++ 的输出【英文标题】:Clearing output of a terminal program Linux C/C++ 【发布时间】:2010-11-23 19:54:39 【问题描述】:

我有兴趣清除由 printf 语句生成的 C 程序的输出,多行。

我最初的猜测是使用

 printf("output1\n");
 printf("output2\n");
 rewind(stdout);
 printf("output3\n");
 printf("output4\n");

但这会产生

 output1
 output2
 output3
 output4

我希望它会产生

 output3
 output4

有人知道如何得到后者的结果吗?

【问题讨论】:

【参考方案1】:

你也可以试试这样,清除整个屏幕:

printf("\033[2J\033[1;1H");

您可以包含\033[1;1H 以确保\033[2J 不会移动左上角的光标。

更具体地说:

033ESC 的八进制数 2J 用于清除整个控制台/终端屏幕(并将光标移动到 DOS ANSI.SYS 的左上角) 1;1H 将光标移动到第 1 行第 1 列

【讨论】:

【参考方案2】:

如果您还记得删除控制字符,您可以获得终端和管道所需的结果。这被硬编码为两行。

#include <stdio.h>

int
main ()

    fputs("output1\n",stdout);
    fputs("output2\n",stdout);
    fputs("\033[A\033[2K\033[A\033[2K",stdout);
    rewind(stdout);
    ftruncate(1,0); /* you probably want this as well */
    fputs("output3\n",stdout);
    fputs("output4\n",stdout);
    return 0;

【讨论】:

哇!效果很好?你能解释一下神秘的 fputs("\033[A\033[2K\033[A\033[2K",stdout);和 ftruncate(1,0); /* 你可能也想要这个 */? 正如我所说的它是两行,如果可以的话,您可以跟踪新行,或者按照其他人的建议清除屏幕。清除 Google 的“VT100 ANSI 转义序列”。如果你不截断文件被倒带但数据仍然存在,直到你覆盖它。例如。 “Hello world”倒带“I am God”会变成“I am Godrld”。 \033[A 上升一行\033[2K 清楚该行(否则它会和倒带有同样的问题) 你喜欢Linux大师吗?大声笑,你喜欢 6 个人中唯一知道这件事的人...... 这并不能完全保证有效。它只在这种情况下有效,因为打印的两条(虚拟)行每条只消耗一条物理行。如果打印的文本足够长以至于它包含不止一个物理行,则需要两个以上的 CUU/EL 对才能将它们全部擦除。到那时,您就进入了跟踪光标位置和换行的领域,整个事情变得更加复杂。【参考方案3】:

就 C 而言,stdout 只不过是一个字节流。该流可以连接到 CRT(或平面屏幕),也可以连接到硬拷贝设备,如电传打字机,甚至是单张纸打印机。在流上调用 rewind 不一定会反映在输出设备上,因为它在该设备的上下文中可能没有任何意义;想想在硬拷贝终端或单张纸打印机上倒带意味着什么。

C 不提供对显示管理的任何内置支持,因此您必须使用第三方库,例如 ncurses。

【讨论】:

【参考方案4】:

大多数终端支持ANSI escape codes。您可以使用 J(带参数 2)清除屏幕,使用 H(带参数 1,1)将光标重置到左上角:

printf("\033[2J\033[1;1H");

另外,更便携的解决方案是使用诸如 ncurses 之类的库,它抽象出终端特定的详细信息。

【讨论】:

参数 1;1 对于 CSI H 来说是完全可选的。无论如何它默认为起始位置 (1,1)。您可以简单地\033[H 将光标归位(我使用助记符“home”来记住它是 H)【参考方案5】:

事实上,当您捕获/重定向您的标准输出(./program > output.file)时,没有办法删除该文件的内容,甚至 printf("\033[2J\033[1;1H" );只需将这个字符序列添加到其中。

【讨论】:

【参考方案6】:

一旦你在终端上打印了一些东西,你就不能轻易地删除它。您可以清除屏幕,但具体操作方式取决于终端类型,清除屏幕将删除屏幕上的所有文本,而不仅仅是您打印的内容。

如果您真的想对屏幕输出进行精细控制,请使用 ncurses 之类的库。

【讨论】:

【参考方案7】:

一种方法是执行 exec('clear')。

【讨论】:

以上是关于清除终端程序 Linux C/C++ 的输出的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Mac OS X 的终端中清除以前的输出?

VSCode:调试开始时清除集成终端

文本环绕时清除终端中的最后一行

linux 常用快捷键

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