Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;ansi转义码不向控制台显示颜色_C++_Ansi - Fatal编程技术网

C++ c++;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

我正在尝试更改控制台中文本的颜色

我们应该使用配置文件从以下位置读取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>
    #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"