Очистка экрана си линукс

Обновлено: 30.06.2024

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

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

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

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

ОТВЕТЫ

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Как можно очистить экран, используя Си, функция clrscr () работает только на виндовских компиляторах, пока не нашел альтернативы ее для unix компиляторов, буду благодарен за информацию.




Два балла за такой совет! Причем гугл ищет ответ на раз. Вот например,


void clrscr(void)
<
char a[80];
printf("\033[2J"); /* Clear the entire screen. */
printf("\033[0;0f"); /* Move cursor to the top left hand corner
*/
>


to Shaman007: спасибо за совет, все верно работает.

А не объяснит ли мне кто-ньть смысл этих магических строк, а-то чё-то сразу и не догоню как-то.

>printf("\033[2J"); /* Clear the entire screen. */
>printf("\033[0;0f"); /* Move cursor to the top left hand corner

Помните магическую последователльность
echo "\033K)" - кажется так

читайте man-ы на терминалы, это коды управления терминалом. Ничего сложного.

Стопудово, спасибо за нпоминание. А-то у меня после 15 часов мозгового штурма уже голова пухнет. Вижу знакомые символы и не понимаю, где я их мог видеть. : )

Вопрос, а со всеми-ли терминалами работает данная эскейп-сиквэнс? Или только с VT100 VT200 VT220?


Со всеми. Если нет - то это ошибка.

А кто мне объяснит смысл этого объявления:


Лгать то не надо, да? Терминалов много разных, далеко не все из них ANSI+DEC.


Тогда наверное придется вникать в terminfo и потом чтонибудь загонять через tputs. Вообще curses рулит на эту тему. Хотя и не везде.

>В графическом режиме - зависит от того, что за графическую оболочку ты
>используешь.
А какие есть? Я начинающий программировать под unix.
>Еще можно выключить питание компьютера - экран тут же очистится :)
оне не очистится, он погаснет:)

>Если можно, еще раз, и помедленнее: что пытаемся сделать, и что не
>работает.

в общем задача такая- создаю что то типа трафшоу. захватываю пакет и смотрю от кого и куда. вывожу на экран. соответственно по экрану побежала строка вверх(обычный вывод). хочется сделать так чтоб выводилась одна строка.
думаю сделать так: repeat очистка экрана- вывод строки-очистка экрана- вывод строки.

>>Если можно, еще раз, и помедленнее: что пытаемся сделать, и что не
>>работает.
>
>в общем задача такая- создаю что то типа трафшоу. захватываю пакет и
>смотрю от кого и куда. вывожу на экран. соответственно по экрану
>побежала строка вверх(обычный вывод). хочется сделать так чтоб выводилась одна строка.
>
>думаю сделать так: repeat очистка экрана- вывод строки-очистка экрана- вывод строки.

man curses

// wbr

>man curses
>
>// wbr

Оооооочень информативно!

>>man curses
>>
>>// wbr
>
>Оооооочень информативно!

Ты man почитай, потом делай выводы об информативности.


Еще полезную информацию по поводу управления выводом на экран можно узнать, набрав
man console_codes
В этом руководстве приведены различные эскейп-последовательности, позволяющие очищать экран, менять цвета, позиционировать курсор куда надо и т.п.
Также совсем недавно промелькнула новость на тему статей по ncurses. Если не знаешь - это такая библиотека, которая поможет тебе бороться с терминалом. Можно делать в текстовом режиме всякие вкусности типа окошек и т.п. Почитай - пригодится. Кстати, по поводу программы, что ты задумал. Есть такая программа - iptraf - она уже все это делает, и причем очень неплохо. Посмотри, может стоит написать что-то еще?
Есть
>такая программа - iptraf - она уже все это делает, и
>причем очень неплохо. Посмотри, может стоит написать что-то еще?
Господа, я просто поставил себе задачу- научится программировать под UNIX.
Причем хочется пошупать сокеты и тд, в общем сеть. Я начинаюший. А по поводу ncurses то скорее всего его просто нет.
>Господа, я просто поставил себе задачу- научится программировать под UNIX.
>Причем хочется пошупать сокеты и тд, в общем сеть. Я начинаюший. А
>по поводу ncurses то скорее всего его просто нет.

это где нет *curses ?

// wbr

>это где нет *curses ?

Linux Slackware 2.2.6 Раритет не спорю.
Но у меня на работе этот гроб с колесиками единственный линух. Я вобще больше фрю люблю. Но книг по порограмированию сетевых приложений, да и вобще всего что связано с программированием больше под линух. Если подскажете где можно нарыть под BSD буду признателен.

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

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

Как очистить терминал в Linux

Самый простой способ очистить терминал - воспользоваться сочетанием клавиш Ctrl + L. После нажатия этих клавиш весь уже существующий вывод переместиться вверх, так, что текущее окно терминала будет пустым:


Тем не менее вся история вывода не будет удалена, вы сможете легко получить к ней доступ просто пролистав немного вверх:


Но если вы не будете пытаться листать историю, окно будет чистым. Если этого вам мало, вы можете воспользоваться командой clear. Она полностью очищает вывод и к предыдущему выводу вы уже вернуться не сможете:

Для того чтобы утилита clear не очищала полностью историю вывода, доступную при прокрутке, а работала аналогично сочетанию клавиш Ctrl+L используйте опцию -x:

Но и у этой команды есть одна проблема. Если вы по ошибке вывели содержимое двоичного файла, ваш эмулятор может быть сломан. Все вводимые вами символы могут превратиться в кракозябры, а приглашение ввода вовсе перестанет работать. Такое происходит потому что в двоичных файлах могут случайно встретиться какие-нибудь управляющие последовательности, ломающие работу терминала.


В такой ситуации команда clear не поможет, здесь нужна команда reset:

Она сбрасывает терминал полностью, не только предыдущий вывод, но и любые настройки, заданные с помощью управляющих последовательностей. После её выполнения вы получите чистый терминал.

Как видите, очистить терминал Linux очень просто. А какие способы знаете вы? Напишите в комментариях!

есть ли "правильный" способ очистить окно консоли в C, кроме использования system("cls") ?

Ну, C не понимает концепцию экрана. Таким образом, любой код не будет переносимым. Может быть, взгляните на попечительством.h или проклятие, согласно вашим потребностям?

переносимость является проблемой, независимо от того, какая библиотека используется.

эта функция будет работать на терминалах ANSI, требует POSIX. Я предполагаю, что есть версия, которая также может работать на консоли окна, так как она также поддерживает escape-последовательности ANSI.

есть некоторые другие варианты, некоторые из которых не перемещают курсор в .

Так как вы упомянули cls , похоже, вы имеете в виду windows. Если так, то этот пункт КБ есть код, который это сделает. Я просто попробовал, и это сработало, когда я вызвал его со следующим кодом:

обходной путь, проверенный в Windows (cmd.exe), Linux (Bash и zsh) и OS X (zsh):

нет портативного способа сделать это. Хотя различные библиотеки манипуляции курсором, такие как проклятия, относительно переносимы. попечительством.h переносится между OS / 2 DOS и Windows, но не для *Nix вариантов.

все понятие "консоли" является понятием, выходящим за рамки стандарта C.

Если вы ищете чистое решение Win32 API, нет ни одного вызова в API консоли Windows, чтобы сделать это. Один из способов - FillConsoleOutputCharacter достаточно большого количества символов. Или WriteConsoleOutput можно использовать GetConsoleScreenBufferInfo чтобы выяснить, сколько символов будет достаточно.

вы также можете создать совершенно новый буфер экрана консоли и сделать текущей.

используя макросы, вы можете проверить, находитесь ли вы в Windows, Linux, Mac или Unix, и вызвать соответствующую функцию в зависимости от текущей платформы. Что-то вроде:

для переносимости попробуйте следующее:

тогда просто позвоните clrscr() . На Windows, он будет использовать conio.h ' s clrscr() , и в Linux он будет использовать escape-коды ANSI.

если вы действительно хотите делать это "правильно", вы можете устранить посредников ( conio , printf , etc.) и сделайте это только с помощью низкоуровневых системных инструментов (подготовьтесь к массивному дампу кода):

Читайте также: