我有一个程序可以将事情记录到STDOUT
。
这些日志条目具有关联的“日志级别”(调试,警告,信息等),我想让用户根据日志级别为此输出着色。
确定STDOUT
是否附加到具有彩色功能的终端的方法是什么?
那我怎么能用颜色输出我的文字呢?
我正在寻找一种只涉及C或C ++调用的解决方案。我想curses
(或ncurses
)有一些东西可以缓解这一点,但我想避免使用它来将我的依赖关系降到最低。
答案 0 :(得分:32)
最简单的检查方法可能就是:
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"