Цветной вывод в C ++ - PullRequest
       7

Цветной вывод в C ++

15 голосов
/ 06 февраля 2012

Есть ли способ распечатать цветной вывод, используя iostream и Xcode? Я хотел бы, например, печатать Hello World! с Hello красным, World синим и ! желтым. Как я могу это сделать?

Ответы [ 2 ]

39 голосов
/ 06 февраля 2012

Вам нужны цветовые коды терминала. Для Linux это следующее (ваша система может отличаться, посмотрите):

//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 */

Это позволяет вам делать следующее:

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

Примечание. Если вы не используете RESET, цвет будет изменяться до следующего использования цветового кода.

1 голос
/ 15 августа 2018

Более подходящим для С ++ способом для терминала с поддержкой ANSI можно написать собственные манипуляторы ANSI-потоков, такие как std :: endl, но для обработки escape-кода ANSI.

Код для этого может выглядеть следующим образомдля базовой необработанной реализации:

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

И это можно использовать в коде, подобном этому:

std::cout << ansi::foreground_red << "in red" << ansi::reset << std::endl;
...