Вопрос

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

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

Это было полезно?

Решение

Существует две простые возможности, которые работают как в 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.

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

Другие советы

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

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

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

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

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

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

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

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

PS1="\[\033[34m\][\$(date +%H%M)][\u@\h:\w]$ "

Вы можете использовать Нкурсы -

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top