C++ BASH下运行的程序的颜色输出

C++ BASH下运行的程序的颜色输出,c++,linux,bash,colors,C++,Linux,Bash,Colors,我需要能够使终端上的一些文本更引人注目,我想的是使文本着色。要么是实际文本,要么是每个字母矩形中的空格(想想vi的光标)。我认为对我的应用程序来说,只有两个额外的规范是重要的:程序应该是独立于发行版的(可以肯定的是,代码将只在BASH下运行),并且在写入文件时(从实际代码或管道输出时)不应该输出额外的字符 我在网上搜索了一些信息,但我只能找到不推荐的cstdlib(stdlib.h)的信息,我需要(实际上,这更像是一种“想要”)使用iostream的功能来完成这项工作。您可能想看看。大多数终端都

我需要能够使终端上的一些文本更引人注目,我想的是使文本着色。要么是实际文本,要么是每个字母矩形中的空格(想想vi的光标)。我认为对我的应用程序来说,只有两个额外的规范是重要的:程序应该是独立于发行版的(可以肯定的是,代码将只在BASH下运行),并且在写入文件时(从实际代码或管道输出时)不应该输出额外的字符


我在网上搜索了一些信息,但我只能找到不推荐的cstdlib(stdlib.h)的信息,我需要(实际上,这更像是一种“想要”)使用iostream的功能来完成这项工作。

您可能想看看。

大多数终端都尊重ASCII颜色序列。它们通过输出
ESC
,然后是
[
,然后是分号分隔的颜色值列表,然后是
m
。这些是常见值:

Special
0  Reset all attributes
1  Bright
2  Dim
4  Underscore   
5  Blink
7  Reverse
8  Hidden

Foreground colors
30  Black
31  Red
32  Green
33  Yellow
34  Blue
35  Magenta
36  Cyan
37  White

Background colors
40  Black
41  Red
42  Green
43  Yellow
44  Blue
45  Magenta
46  Cyan
47  White
因此,输出
“\033[31;47m”
应使终端前端(文本)颜色为红色,背景颜色为白色

你可以用C++形式很好地包装:

enum Color {
    NONE = 0,
    BLACK, RED, GREEN,
    YELLOW, BLUE, MAGENTA,
    CYAN, WHITE
}

std::string set_color(Color foreground = 0, Color background = 0) {
    char num_s[3];
    std::string s = "\033[";

    if (!foreground && ! background) s += "0"; // reset colors if no params

    if (foreground) {
        itoa(29 + foreground, num_s, 10);
        s += num_s;

        if (background) s += ";";
    }

    if (background) {
        itoa(39 + background, num_s, 10);
        s += num_s;
    }

    return s + "m";
}

您还可以创建自定义函数,如:

void textcolor(int color)
{
    std::cout<<"\033]"<<color;
}
void textcolor(int-color)
{

std::cout这是@nightcracker上面代码的一个版本,使用
stringstream
而不是
itoa
(它使用clang++、C++11、OSX10.7、iTerm2和bash运行)

#包括
#包括
#包括
枚举颜色
{
无=0,
黑,红,绿,
黄色,蓝色,洋红,
青色,白色
};
静态标准::字符串设置颜色(颜色前景=无,颜色背景=无)
{
std::strings;

s您可以从github()使用libcolor

#包括“libcolor/libcolor.h”
#包括
使用名称空间std;
int main()
{

不要忘记序列的终止符,比如
“\033]31;47m”
@JoachimPileborg:fixed。
#include <iostream>
#include <string>
#include <sstream>

enum Color
{
    NONE = 0,
    BLACK, RED, GREEN,
    YELLOW, BLUE, MAGENTA,
    CYAN, WHITE
};

static std::string set_color(Color foreground = NONE, Color background = NONE)
{
    std::stringstream s;
    s << "\033[";
    if (!foreground && ! background){
        s << "0"; // reset colors if no params
    }
    if (foreground) {
        s << 29 + foreground;
        if (background) s << ";";
    }
    if (background) {
        s << 39 + background;
    }
    s << "m";
    return s.str();
}

int main(int agrc, char* argv[])
{
    std::cout << "These words should be colored [ " <<
        set_color(RED) << "red " <<
        set_color(GREEN) << "green " <<
        set_color(BLUE) << "blue" <<
        set_color() <<  " ]" << 
        std::endl;
    return EXIT_SUCCESS;
}
#include "libcolor/libcolor.h"
#include <iostream>
using namespace std; 
int main()
{
     cout << font_color::green << "Hello World" << endl;
}