C++ c++;ansi转义码不向控制台显示颜色
我正在尝试更改控制台中文本的颜色 我们应该使用配置文件从以下位置读取ansi转义码: 这是我档案里的东西C++ c++;ansi转义码不向控制台显示颜色,c++,ansi,C++,Ansi,我正在尝试更改控制台中文本的颜色 我们应该使用配置文件从以下位置读取ansi转义码: 这是我档案里的东西 red \033[0;31m #red blue \033[0;34m #blue green \033[0;32m #green grey \033[0;37m #grey 这是我的密码: #include <iostream> #include <sstream> #inc
red \033[0;31m #red
blue \033[0;34m #blue
green \033[0;32m #green
grey \033[0;37m #grey
这是我的密码:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <fstream>
#include <map>
using namespace std;
int main(int argc, char * argv[]){
string file = "config.txt";
string line = "";
string tag = "";
string ansi = "";
map <string, string> m;
if(argc == 2){
file = argv[1];
}
ifstream in(file, ios_base::in | ios_base::binary);
if(!in){
cerr<<"could not open file";
}
while (getline(in, line)){
istringstream iss(line);
if(iss>>tag>>ansi){
auto it = m.find(tag);
if(it == m.end()){
m.insert(make_pair(tag,ansi));
}
}
}
for(auto x: m){
cout<<x.second<<x.first<<endl;
}
cout<<"\033[0;35mhello";
return 0;
}
文件中的转义序列不会转换为ESC字符 此外,您的文件具有公共部分 出于这个原因,我将包含ESC字符的公共部分移动到程序中,并使配置文件只有颜色代码 文件: 节目:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <fstream>
#include <map>
using namespace std;
int main(int argc, char * argv[]){
string file = "config.txt";
string line = "";
string tag = "";
string ansi = "";
map <string, string> m;
if(argc == 2){
file = argv[1];
}
ifstream in(file, ios_base::in | ios_base::binary);
if(!in){
cerr<<"could not open file";
}
while (getline(in, line)){
istringstream iss(line);
if(iss>>tag>>ansi){
auto it = m.find(tag);
if(it == m.end()){
m.insert(make_pair(tag,ansi));
}
}
}
for(auto x: m){
cout<<"\033[0;"<<x.second<<"m"<<x.first<<endl;
}
cout<<"\033[0;35mhello";
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[]){
string file=“config.txt”;
字符串行=”;
字符串标签=”;
字符串ansi=“”;
地图m;
如果(argc==2){
file=argv[1];
}
ifstream-in(文件,ios_-base::in | ios_-base::binary);
如果(!in){
cerrtag>>ansi){
自动it=m.find(标记);
如果(it==m.end()){
m、 插入(配对(标签,ansi));
}
}
}
用于(自动x:m){
cout读取config.txt文件时出现的问题是,读取字符串时,字符串被指定为:
std::string str = "\\033[0;31m";
i、 e.\
被视为一个字符。您在代码中需要的是“\033”
,即八进制数033
表示的字符
您可以更改代码中的以下行以忽略字符串的“\\033”
部分并打印八进制数
cout << x.second << x.first <<endl;
cout而不是这样做:
cout<<"\033[0;35mhello";
我必须在这里应用一个相当数量的猜测,但是在我看来,如果你把它放进C++程序中,你会认为文本文件中的<代码> 033代码>代码将被解释为ESC。然而,情况并非如此。反斜线对编译器运行的解析器只有一个意义。对于文本输入,程序员可以由你来处理。\033
作为ESC。对于输入函数,它只是字符串{'\\','0','3','3'}
。您必须自己解析和转换文件中的转义序列,或者更改配置文件的格式。我想是这样的……那么我该怎么做呢?配置文件的格式是否已修复?最简单的解决方案是简单地制作CSI(控制序列简介,\033[
)隐式(即由您的程序添加的)。这也会使配置文件看起来更简单。是的,我认为本课程的讲师对格式要求非常严格。我将忽略序列的前四个字符,并在序列的其余部分之前手动打印转义序列。它可以工作!:)
cout << x.second << x.first <<endl;
cout << '\033' << x.second.substr(4) << x.first <<endl;
cout<<"\033[0;35mhello";
cout << ansi::foreground_magenta << "hello" ;
#include <ostream>
namespace ansi {
template < class CharT, class Traits >
constexpr
std::basic_ostream< CharT, Traits > & reset( std::basic_ostream< CharT, Traits > &os )
{
return os << "\033[0m";
}
template < class CharT, class Traits >
constexpr
std::basic_ostream< CharT, Traits > & foreground_black( std::basic_ostream< CharT, Traits > &os )
{
return os << "\033[30m";
}
template < class CharT, class Traits >
constexpr
std::basic_ostream< CharT, Traits > & foreground_red( std::basic_ostream< CharT, Traits > &os )
{
return os << "\033[31m";
}
...
} // ansi
#define foreground_magenta "\033[35m"