консольная печать без прокрутки - PullRequest
5 голосов
/ 03 января 2009

Эй, ребята, я видел консольные приложения, печатающие цвета, и видел такие приложения, как ffmpeg, печатающий текст поверх новой строки. Как мне распечатать существующую строку? я хочу отображать fps в моем консольном приложении либо в самом верху, либо в самом низу, чтобы там были обычные printfs, и они обычно прокручивали

-edit- Мне это нужно для Windows, но это должно быть кроссплатформенным, так что в итоге у меня будет реализация для Linux и Mac

Ответы [ 7 ]

19 голосов
/ 03 января 2009

Существует две простые возможности, которые работают как на Linux, так и на Windows, но только для одной строки:

  • printf("\b"); вернется для одного символа, так что вы можете посчитать, сколько символов вы хотите возвратить и запустить это в цикле, или вы знаете, что пишете только n чисел и делаете это как
    printf("\b\b\b\b\b\b\b\b\b\b");
  • printf("text to be overwritten by next printf\r"); это вернет курсор в начало строки, поэтому любой следующий printf перезапишет его. Обязательно напишите строку одинаковой или большей длины, чтобы полностью перезаписать ее.

Если вы хотите переписать несколько строк, нет ничего более портативного, чем ncurses , для него есть библиотеки практически во всех операционных системах, и вам не нужно заботиться о ANSI-различиях .

edit: добавлена ​​ссылка на страницу википедии ncurses, дает отличный обзор и введение, а также список ссылок и, возможно, перевод на ваш предпочитаемый язык

3 голосов
/ 03 января 2009

Вы можете использовать '\r' вместо '\n'.

3 голосов
/ 03 января 2009

Проверьте ncurses. У него есть привязки для большинства языков сценариев.

2 голосов
/ 03 января 2009

Магия цветов, расположение курсора и блики внутри него Экранирующие коды ANSI . Любая текстовая консоль, способная обрабатывать коды ANSI, может использовать их, просто распечатывая их на консоли (то есть с помощью echo в скрипте bash или функции printf () в C).

Терминалы Unix поддерживают escape-последовательности ANSI, и мир Windows раньше поддерживал их в прежние времена MS-DOS, но поддержка многобайтовых консолей положила этому конец. Больше информации здесь . Однако есть и другие способы печати только последовательностей ANSI , доступные в Windows . Более того, если у вас установлен Cygwin, код обработки ANSI Windows работает так же хорошо, как и на любом терминале Unix.

Многие люди упоминают библиотеку Ncurses, которая является стандартом де-факто для любых текстовых приложений, подобных GUI. Эта библиотека делает, чтобы скрыть все различия между терминалами (разновидности Windows / Unix), чтобы представлять одинаковую информацию как можно более одинаковой для всех платформ, хотя, исходя из собственного опыта, я говорю вам, что это не всегда так (то есть типичные рамки текстового окна изменить, потому что специальные символы доступны не для всех кодировок символов). Аналогом использования ncurses является то, что это полный API, и с ним гораздо сложнее начать, чем просто записать некоторые escape-последовательности ANSI для простых вещей, таких как изменение цвета шрифта, очистка экрана или перемещение курсора назад на случайный положение.

Ради полноты я вставляю пример использования последовательности ANSI в Linux, которая меняет подсказку на синий и показывает дату:

PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "
2 голосов
/ 03 января 2009

ASCII-символ номер 8 (A.K.A. Ctrl-H, BS или Backspace) позволяет создать резервную копию одного символа. Символ ASCII с номером 13 (A.K.A Ctrl-M, CR или возврат каретки) возвращает курсор в начале строки.

Если вы работаете в C, попробуйте putchar(8); и putchar(13);

1 голос
/ 03 января 2009

В зависимости от платформы, на которой вы разрабатываете, вероятно, вы можете использовать более мощный API, нежели старые управляющие коды ASCII.

например. Если вы работаете на Win32, вы можете напрямую управлять буфером экрана консоли.

Хорошее место для начала может быть здесь http://msdn.microsoft.com/en-us/library/ms683171(VS.85).aspx

Я искал похожие функции / API, которые позволили бы мне получить доступ к консоли как к чему-то другому, чем поток текста для других платформ. Пока ничего не нашел, но опять же, я не так уж и долго искал.

Надеюсь, это поможет.

1 голос
/ 03 января 2009

Вы можете использовать Ncurses -

ncurses package - это библиотека подпрограмм для независимой от терминала рисования экрана и обработки событий ввода, которая представляет программисту модель экрана высокого уровня, скрывая различия между типами терминалов и выполняя автоматическую оптимизацию вывода для изменения одного экрана из текст в другой

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