Подтвердить что ты не робот

Очистка вывода терминальной программы Linux C/С++

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

Мое первоначальное предположение заключалось в использовании

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

но это дает

 output1
 output2
 output3
 output4

Я надеялся, что это произведет

 output3
 output4

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

4b9b3361

Ответ 1

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

#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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Один из способов - выполнить exec ('clear').

Ответ 6

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

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

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

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

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

Ответ 7

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