Используя C/С++, как вы печатаете на stdout в цвете, но только если терминал поддерживает его? - программирование
Подтвердить что ты не робот

Используя C/С++, как вы печатаете на stdout в цвете, но только если терминал поддерживает его?

У меня есть программа, которая записывает события в STDOUT.

Эти записи журнала имеют связанный "уровень журнала" (отладка, предупреждение, информация и т.д.), и я хотел бы дать пользователю возможность цвета этого вывода в зависимости от уровня журнала.

Каким образом можно определить, прикреплен ли STDOUT к терминалу, который способен использовать цвет? И как я могу вывести свой текст с цветами тогда?

Я ищу решение, которое включает только вызовы C или С++. Я полагаю, что curses (или ncurses) может что-то облегчить, но я бы хотел избежать его использования, чтобы свести мои зависимости к минимуму.

4b9b3361

Ответ 1

Вероятно, самый простой способ проверить:

isatty(fileno(STDOUT))

Это вернет 1, если ваш стандартный вывод будет отправлен на любой терминал. На практике любой терминал будет поддерживать или игнорировать цветовые коды VT100; рассмотрение terminfo не требуется, если вы не ожидаете вывода на некоторые действительно необычные аппаратные терминалы. (Большинство из них не были сделаны за последние десятилетия.)

Для вывода цветов используйте (расширенную) последовательность SGR:

"\x1b[%dm"

где %d - одно из следующих значений для широко поддерживаемых цветов:

0: reset colors/style
1: bold
4: underline
30 - 37: black, red, green, yellow, blue, magenta, cyan, and white text
40 - 47: black, red, green, yellow, blue, magenta, cyan, and white background

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

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

"\x1b[1;35;42m"