Очистка вывода терминальной программы Linux C / C ++ - PullRequest
20 голосов
/ 28 августа 2009

Меня интересует очистка вывода программы на C, созданной с помощью операторов printf, длиной в несколько строк.

Первоначально я предполагал использовать

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

но это производит

 output1
 output2
 output3
 output4

Я надеялся, что это даст

 output3
 output4

Кто-нибудь знает, как получить последний результат?

Ответы [ 7 ]

23 голосов
/ 29 августа 2009

Вы можете получить желаемый результат как для терминала, так и для каналов, если не забываете также удалить управляющие символы. Это жестко запрограммировано для двух строк.

#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;
}
18 голосов
/ 28 августа 2009

Большинство терминалов поддерживают Экранирующие коды ANSI . Вы можете использовать J (с параметром 2), чтобы очистить экран, и H (с параметрами 1,1), чтобы сбросить курсор вверху слева:

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

В качестве альтернативы, более переносимым решением было бы использование библиотеки, такой как ncurses , которая абстрагирует детали, специфичные для терминала.

17 голосов
/ 28 августа 2009

После того, как вы напечатаете что-то в терминале, вы не сможете его легко удалить. Вы можете очистить экран, но как это сделать, зависит от типа терминала, и очистка экрана удалит весь текст на экране, а не только то, что вы напечатали.

Если вам действительно нужен точный контроль над выводом на экран, используйте такую ​​библиотеку, как ncurses .

4 голосов
/ 07 мая 2014

Вы также можете попробовать что-то вроде этого, что очищает весь экран:

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

Вы можете включить \033[1;1H, чтобы убедиться, что \033[2J не перемещает курсор в верхнем левом углу.

Более конкретно:

  • 033 является восьмеричным ESC
  • 2J предназначен для очистки всего экрана консоли / терминала (и перемещает курсор в верхний левый угол в DOS ANSI.SYS)
  • 1;1H перемещает курсор в строку 1 и столбец 1
4 голосов
/ 28 августа 2009

Что касается C, stdout - не более чем поток байтов. Этот поток может быть присоединен к ЭЛТ (или плоскому экрану), или он может быть подключен к устройству с твердой копией, например, телетайпу или даже к листовому принтеру. Вызов перемотки в потоке не обязательно будет отражен на устройстве вывода, потому что это может не иметь никакого смысла в контексте этого устройства; подумайте о том, что будет означать перемотка на печатном терминале или листовом принтере.

C не предлагает никакой встроенной поддержки для управления дисплеем, поэтому вам придется использовать стороннюю библиотеку, такую ​​как ncurses.

3 голосов
/ 28 августа 2009

На самом деле, когда вы захватываете / перенаправляете свой стандартный вывод (./program> output.file), нет способа удалить содержимое этого файла, даже printf ("\ 033 [2J \ 033 [1; 1H") ); просто добавляет эту последовательность символов в него.

3 голосов
/ 28 августа 2009

Один из способов - выполнить exec («очистить»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...