我有兴趣清除使用printf语句生成的C程序的输出,多行很长。
我最初的猜测是使用
printf("output1\n");
printf("output2\n");
rewind(stdout);
printf("output3\n");
printf("output4\n");
但这会产生
output1
output2
output3
output4
我希望它会产生
output3
output4
有谁知道如何获得后者的结果?
答案 0 :(得分: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;
}
答案 1 :(得分:18)
大多数终端支持ANSI escape codes。您可以使用J(带参数2)清除屏幕,使用H(带参数1,1)将光标重置为左上角:
printf("\033[2J\033[1;1H");
或者,更便携的解决方案是使用诸如ncurses之类的库,它抽象出特定于终端的细节。
答案 2 :(得分:17)
将内容打印到终端后,您无法轻松将其删除。您可以清除屏幕,但具体如何操作取决于终端类型,清除屏幕将删除屏幕上的所有文本,而不仅仅是您打印的内容。
如果您真的希望对屏幕输出进行精确控制,请使用ncurses等库。
答案 3 :(得分:4)
就C而言,stdout只不过是一个字节流。该流可以连接到CRT(或平面屏幕),或者它可以连接到硬拷贝设备,如电传打字机或甚至是单张纸打印机。在流上调用倒带不一定会反映在输出设备上,因为它在该设备的上下文中可能没有任何意义;想想复卷在硬拷贝终端或单张纸打印机上的意义。
C不提供任何内置的显示管理支持,因此您必须使用像ncurses这样的第三方库。
答案 4 :(得分:4)
你也可以尝试这样的东西,它会清除整个屏幕:
printf("\033[2J\033[1;1H");
您可以添加\033[1;1H
以确保\033[2J
是否不会将光标移动到左上角。
更具体地说:
033
是ESC
2J
用于清除整个控制台/终端屏幕(并在DOS ANSI.SYS上将光标移动到左上角)1;1H
将光标移动到第1行和第1列答案 5 :(得分:3)
一种方法是做一个exec('clear')。
答案 6 :(得分:3)
实际上,当你捕获/重定向stdout(./program&gt; output.file)时,无法删除该文件的内容,甚至是printf(“\ 033 [2J \ 033 [1; 1H] “);只是将这个字符序列添加到其中。