Очистка вывода терминальной программы Linux C/С++
Мне интересно очистить вывод программы C, созданной с помощью операторов printf, длиной в несколько строк.
Мое первоначальное предположение заключалось в использовании
printf("output1\n");
printf("output2\n");
rewind(stdout);
printf("output3\n");
printf("output4\n");
но это дает
output1
output2
output3
output4
Я надеялся, что это произведет
output3
output4
Кто-нибудь знает, как получить последний результат?
Ответы
Ответ 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" ); просто добавляет в него эту последовательность символов.