清除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。
进一步来说:
-
033
是ESC
的八进制 -
2J
用于清除整个控制台/terminal屏幕(并将光标移到DOS ANSI.SYS的左上angular) -
1;1H
将光标移动到第1行和第1列