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