Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Colored output in C++

Is there a way to print colored output using iostream and Xcode? I'd like to be able to, for example, print Hello World! with Hello red, World blue and ! yellow. How can I do that?

like image 861
Shoe Avatar asked Feb 06 '12 09:02

Shoe


People also ask

What is the output of Colour?

Color Light Output (CLO), also known as Color Brightness, is a specification that provides information on a projector's ability to reproduce color. Color Light Output is specified in the lumen unit and measures a color projection system's ability to correctly reproduce color brightness.

How many colors are there in C language?

Total number of colors available are 16. Number of available colors depends on current graphics mode and driver. For example, setcolor(RED) or setcolor(4) changes the current drawing color to RED.


2 Answers

You need the terminal color codes. For linux it's the following (your system might be different, look it up):

//the following are UBUNTU/LINUX, and MacOS ONLY terminal color codes. #define RESET   "\033[0m" #define BLACK   "\033[30m"      /* Black */ #define RED     "\033[31m"      /* Red */ #define GREEN   "\033[32m"      /* Green */ #define YELLOW  "\033[33m"      /* Yellow */ #define BLUE    "\033[34m"      /* Blue */ #define MAGENTA "\033[35m"      /* Magenta */ #define CYAN    "\033[36m"      /* Cyan */ #define WHITE   "\033[37m"      /* White */ #define BOLDBLACK   "\033[1m\033[30m"      /* Bold Black */ #define BOLDRED     "\033[1m\033[31m"      /* Bold Red */ #define BOLDGREEN   "\033[1m\033[32m"      /* Bold Green */ #define BOLDYELLOW  "\033[1m\033[33m"      /* Bold Yellow */ #define BOLDBLUE    "\033[1m\033[34m"      /* Bold Blue */ #define BOLDMAGENTA "\033[1m\033[35m"      /* Bold Magenta */ #define BOLDCYAN    "\033[1m\033[36m"      /* Bold Cyan */ #define BOLDWHITE   "\033[1m\033[37m"      /* Bold White */ 

This allows you to do the following:

std::cout << RED << "hello world" << RESET << std::endl; 

Note: If you don't use RESET the color will remain changed until the next time you use a color code.

like image 88
shuttle87 Avatar answered Oct 02 '22 16:10

shuttle87


In a more c++ way for an ANSI capable terminal, it is possible to write your own ansi stream manipulators like std::endl but for handling ansi escape code.

Code for doing so can look like this for basic raw implementation:

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 

And it can be used in a code like this:

std::cout << ansi::foreground_red << "in red" << ansi::reset << std::endl; 
like image 40
user760453 Avatar answered Oct 02 '22 17:10

user760453