代码之家  ›  专栏  ›  技术社区  ›  ldog

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

  •  20
  • ldog  · 技术社区  · 17 年前

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

    我最初的猜测是

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

    但这会产生

     output1
     output2
     output3
     output4
    

    我希望它能产生

     output3
     output4
    

    有人知道如何得到后一个结果吗?

    7 回复  |  直到 10 年前
        1
  •  23
  •   jbcreix    17 年前

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

    #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;
    }
    
        2
  •  18
  •   Adam Rosenfield    17 年前

    大多数终端支持 ANSI escape codes . 可以使用J(带参数2)清除屏幕,使用H(带参数1,1)将光标重置到左上角:

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

    或者,一个更可移植的解决方案是使用一个库,比如 ncurses ,它抽象出终端特定的细节。

        3
  •  17
  •   Craig    17 年前

    一旦你把东西打印到终端上,你就不能轻易地删除它。您可以清除屏幕,但具体如何清除取决于终端类型,清除屏幕将删除屏幕上的所有文本,而不仅仅是打印的文本。

    如果您真的想对屏幕输出进行精细控制,可以使用如下库 ncurses .

        4
  •  4
  •   John Bode    17 年前

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

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

        5
  •  4
  •   Snake Eyes    10 年前

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

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

    你可以包括 \033[1;1H 以确保 \033[2J 不在左上角移动光标。

    更具体地说:

    • 033 是的八进制 ESC
    • 2J 用于清除整个控制台/终端屏幕(并将光标移到dos ansi.sys上的左上角)
    • 1;1H 将光标移到第1行和第1列
        6
  •  3
  •   user59634    17 年前

    一种方法,是执行一个exec(“clear”)。

        7
  •  3
  •   nothrow    17 年前

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