我有兴趣清除用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)
Ada*_*eld 18
大多数终端支持ANSI转义码.您可以使用J(带参数2)清除屏幕,使用H(带参数1,1)将光标重置为左上角:
printf("\033[2J\033[1;1H");
Run Code Online (Sandbox Code Playgroud)
或者,更便携的解决方案是使用诸如ncurses的库,其抽象出特定于终端的细节.
您也可以尝试这样的操作,它会清除整个屏幕:
printf("\033[2J\033[1;1H");
Run Code Online (Sandbox Code Playgroud)
您可以包括\033[1;1H以确保\033[2J不移动左上角的光标。
进一步来说:
033 是八进制 ESC2J 用于清除整个控制台/终端屏幕(并将光标移动到 DOS ANSI.SYS 的左上角)1;1H 将光标移动到第 1 行和第 1 列