2015-10-25 46 views
4

我想改變控制檯中文本的顏色。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> 
    #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; 
} 

不確定爲什麼,但只有最後一個打印語句實際上以彩色顯示,其他輸出的ansi轉義代碼以文本形式輸出。

這裏是我的輸出:

\033[0;34mblue 
\033[0;32mgreen 
\033[0;37mgrey 
\033[0;31mred 
hello (in purple) 
+1

我必須在這裏應用相當數量的猜測,但在我看來,如果您將它讀入C++程序,您認爲文本文件中的「\ 033」將被解釋爲ESC。然而,這種情況並非如此。反斜槓只對編譯器運行的解析器有意義。對於文本輸入,由程序員決定將'\ 033'作爲ESC來處理。輸入函數只是字符串'{'\\','0','3','3'}'。 – 5gon12eder

+0

您必須自己解析並轉換文件中的轉義序列,或者更改配置文件的格式。 – MikeCAT

+0

我覺得它是這樣的......所以我該如何做到這一點? – js091514

回答

1

與讀取config.txt的文件的問題是,因爲雖然它被指定爲串讀:

std::string str = "\\033[0;31m"; 

\被視爲一個字符。您需要的代碼是"\033",即由八進制數033表示的字符。

您可以更改代碼中的以下行來忽略字符串的​​部分並打印八進制數。

cout << x.second << x.first <<endl; 

需要是:

cout << '\033' << x.second.substr(4) << x.first <<endl; 

隨着這種變化,我想我的桌面上的程序,並將其按預期工作。

1

文件中的轉義序列將不會轉換爲ESC字符。

此外,您的文件具有相同的部分。

因此,我將包含ESC字符的公共部分移動到了程序並且配置文件只有顏色代碼。

文件:

red  31  #red 
blue 34  #blue 
green 32  #green 
grey 37  #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<<"\033[0;"<<x.second<<"m"<<x.first<<endl; 
    } 
    cout<<"\033[0;35mhello"; 
    return 0; 
}