I am trying to change the color of text in the console.
We are supposed to use a config file to read the ansi escape codes from:
this is what's in my file
red \033[0;31m #red
blue \033[0;34m #blue
green \033[0;32m #green
grey \033[0;37m #grey
Here is my code:
#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;
}
Not sure why but only the last print statement actually displays in color the other outputs the ansi escape codes as text.
Here is my output :
\033[0;34mblue
\033[0;32mgreen
\033[0;37mgrey
\033[0;31mred
hello (in purple)
The problem with reading the config.txt files is that the string is read as though it is assigned to be:
std::string str = "\\033[0;31m";
i.e. the \ is treated as a character. What you need in code is "\033", i.e. the character represented by the octal number 033.
You can change the following lines in your code to ignore the "\\033" part of the string and print the octal number.
cout << x.second << x.first <<endl;
needs to be:
cout << '\033' << x.second.substr(4) << x.first <<endl;
With that change, I tried your program on my desktop and it works as expected.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With