清除terminal程序的输出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 

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

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

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

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

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

或者,更便携的解决scheme将是使用一个库,如ncurses ,它抽象出terminal特定的细节。

一旦你打印的东西到terminal,你不能轻易地删除它。 您可以清除屏幕,但具体怎么做取决于terminaltypes,清除屏幕将删除屏幕上的所有文本,而不仅仅是您打印的内容。

如果你真的想要很好地控制屏幕输出,可以使用像ncurses这样的库。

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

C不提供任何内置的显示pipe理支持,所以你必须使用像ncurses这样的第三方库。

一个办法是做一个高pipe('明确')。

事实上,当你捕获/redirect你的标准输出(./program> output.file)时,如何删除该文件的内容,甚至printf(“\ 033 [2J \ 033 [1; 1H”); 只是将这个字符序列添加到它。

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

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

您可以包含\033[1;1H以确保\033[2J是否不移动光标在左上angular。

进一步来说:

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