繁体   English   中英

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

[英]Clearing output of a terminal program Linux C/C++

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

我最初的猜测是使用

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

但这会产生

 output1
 output2
 output3
 output4

我希望它会产生

 output3
 output4

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

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

#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;
}

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

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

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

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

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

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

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

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

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

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

进一步来说:

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

一种方法是做一个exec('clear')。

实际上,当你捕获/重定向stdout(./program> output.file)时,无法删除该文件的内容,甚至是printf(“\\ 033 [2J \\ 033 [1; 1H”); 只是将这个字符序列添加到其中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM