C++ 使用C/C++;,如何以彩色打印到标准输出,但前提是终端支持彩色打印?

C++ 使用C/C++;,如何以彩色打印到标准输出,但前提是终端支持彩色打印?,c++,c,linux,colors,C++,C,Linux,Colors,我有一个程序可以把事情记录到STDOUT 这些日志条目有一个相关的“日志级别”(调试、警告、信息等),我想让用户能够根据日志级别为输出着色 确定是否将标准输出连接到支持颜色的终端的方法是什么? 那么我怎样才能用颜色输出文本呢 我正在寻找一个只包含C或C++调用的解决方案。我想,诅咒(或课程)可以缓解这一问题,但我想避免使用它来将依赖关系降到最低。可能最简单的检查方法就是: isatty(fileno(STDOUT)) 如果标准输出被发送到任何类型的终端,这将返回1。实际上,任何终端都将支持或忽

我有一个程序可以把事情记录到STDOUT

这些日志条目有一个相关的“日志级别”(调试、警告、信息等),我想让用户能够根据日志级别为输出着色

确定是否将标准输出连接到支持颜色的终端的方法是什么? 那么我怎样才能用颜色输出文本呢


我正在寻找一个只包含C或C++调用的解决方案。我想,
诅咒
(或
课程
)可以缓解这一问题,但我想避免使用它来将依赖关系降到最低。

可能最简单的检查方法就是:

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"

这是同一个问题吗?您不想手动读取terminfo数据库。不,您没有。请参阅潜在客户的“精确副本”投票者:提议的副本并没有回答确定标准输出是否支持颜色的问题。@DavidHammen:Git实际上是这样做的:它检测输出是否要发送到终端,以及用户是否需要颜色,并且仅当这两个条件都匹配时才输出。它是ANSI,而不是VT100,代码。或者ISO/IEC 6429代码,如果你想精确的话。请注意,
“\x1b[”
==
“\033[”
==CSI.有一个很好的列表,以及可移植性和其他有用的信息。请注意:Xcode(OSX的标准IDE)内置控制台不支持(也不忽略)ANSI颜色序列(它试图打印它们,导致无法读取的垃圾)我真的很喜欢一个可以检查颜色支持的片段。