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

ldo*_*dog 20 c linux terminal

我有兴趣清除用printf语句生成的C程序的输出,多行很长.

我最初的猜测是使用

 printf("output1\n");
 printf("output2\n");
 rewind(stdout);
 printf("output3\n");
 printf("output4\n");
Run Code Online (Sandbox Code Playgroud)

但这会产生

 output1
 output2
 output3
 output4
Run Code Online (Sandbox Code Playgroud)

我希望它会产生

 output3
 output4
Run Code Online (Sandbox Code Playgroud)

有谁知道如何获得后者的结果?

小智 23

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • \ 033 [A是上线\ 033 [2K清除该行(否则它将与倒带有相同的问题) (10认同)
  • 哇!哪作得好?你可以解释神秘的fputs("\ 033 [A\033 [2K\033 [A\033 [2K",stdout); 和ftruncate(1,0);/*你可能也想要这个*/? (3认同)
  • 你喜欢linux大师吗?大声笑,你是唯一一个了解这个人的人... (3认同)
  • 这不能保证工作.它只适用于这种情况,因为每个打印的两条(虚拟)线只消耗一条物理线.如果打印的文本足够长以至于它包含多个物理线,则需要两个以上的CUU/EL对才能将它们全部擦除.那时你正处于跟踪光标位置和包裹的领域,整个事情变得更加复杂. (3认同)

Ada*_*eld 18

大多数终端支持ANSI转义码.您可以使用J(带参数2)清除屏幕,使用H(带参数1,1)将光标重置为左上角:

printf("\033[2J\033[1;1H");
Run Code Online (Sandbox Code Playgroud)

或者,更便携的解决方案是使用诸如ncurses的库,其抽象出特定于终端的细节.


Cra*_*aig 17

将内容打印到终端后,您无法轻松将其删除.您可以清除屏幕,但具体如何操作取决于终端类型,清除屏幕将删除屏幕上的所有文本,而不仅仅是您打印的内容.

如果你真的想要对屏幕输出进行精确控制,请使用像ncurses这样的库.

  • 我是第二个回答.ncurses是一个很棒的图书馆. (3认同)

gon*_*332 5

您也可以尝试这样的操作,它会清除整个屏幕:

printf("\033[2J\033[1;1H");
Run Code Online (Sandbox Code Playgroud)

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

进一步来说:

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