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?
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.
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.
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.
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;
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