Colored output in C++

前端 未结 3 1998
后悔当初
后悔当初 2021-02-01 04:39

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,

相关标签:
3条回答
  • 2021-02-01 05:22

    Use {fmt} library, which is being slowly absorbed into C++ standard, starting with C++20 in header. Text colors and styles are not in the standard yet, AFAIK, but you can get them with the version on github, where you can find this example:

    #include <fmt/color.h>
    
    int main() {
      fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
                 "Hello, {}!\n", "world");
      fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
                 fmt::emphasis::underline, "Hello, {}!\n", "мир");
      fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
                 "Hello, {}!\n", "世界");
    }
    
    0 讨论(0)
  • 2021-02-01 05:27

    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.

    0 讨论(0)
  • 2021-02-01 05:28

    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;
    
    0 讨论(0)
提交回复
热议问题