一尘不染

使用C / C ++,如何在终端支持的情况下以彩色打印到标准输出?

linux

我有一个程序可以将内容记录到STDOUT

这些日志条目具有关联的“日志级别”(调试,警告,信息等),我希望使用户能够根据日志级别对输出进行着色。

确定是否STDOUT连接到具有彩色功能的终端的方法是什么?那我该如何用颜色输出文本呢?

我正在寻找仅涉及C或C ++调用的解决方案。我猜curses(或ncurses)可以缓解这种情况,但是我想避免使用它来将依赖关系降到最低。


阅读 268

收藏
2020-06-07

共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"
2020-06-07