Top/article/Colored-text-to-stdout
English | Japanese
English | Japanese

Menu

  • Top
  • Akihiko Yamaguchi 山口 明彦
  • Project プロジェクト
  • Text テキスト
  • Recent articles 最近の記事
  • Articles 記事一覧 (a to z)
  • Search 検索

Tags タグ †

  • [c++][bash][python][latex][php]
  • [linux][windows][mac][android]
  • [math][algorithm][idea][trick]
  • [liboctave][opencv][git][ros]
  • [setting][bug][general]
↑

Recent articles 最近の記事 †

2019-07-02
  • article/Display-Unix-Time
  • article/Synchronize-Linux-Time-to-Remote
2018-09-27
  • article/python-multimode-singleton
2018-09-02
  • article/rosinstall-git-default-remote
2017-07-28
  • article/SubMenu
2017-03-05
  • article/Import-a-different-version-of-OpenCV-in-Python
2015-08-17
  • article/DRC-finals-2015
2015-01-05
  • article/Upgrade-Android-to-Lollipop
2015-01-01
  • article/Kernel-panic-of-Linux-when-using-Xtion
  • article/Do-not-skip-freeing-data-when-using-tri-mesh-in-ODE
Access: 1/2916 - Admin
These search terms have been highlighted:[linux]

How to print a colored text to stdout?

端末に色つきテキストを出力する

[c++][trick][linux]
2008-10-01

iomanip の setw(5) みたいなノリで,出力する文字に色をつける方法を考える.

  cout<<ioscc::green<<"GREEN"<<endl;

のようにすれば,緑色で GREEN が表示されるようにしたい. std::endl で色がリセットされる. で,書いてみたのが以下のコード.

#include <iostream>

namespace ioscc
{
  enum TColorCode {red=1, blue, green};
  const char *_sesc    = "\033[";
  const char *_sreset  = "0m";
  const char *_sred    = "31;1m";
  const char *_sblue   = "34;1m";
  const char *_sgreen  = "32;1m";
};

struct _colored_stream
{
  std::ostream &os;
};

inline _colored_stream operator<< (std::ostream &os, ioscc::TColorCode ccode)
{
  switch (ccode)
  {
    case ioscc::red    : os<<ioscc::_sesc<<ioscc::_sred;   break;
    case ioscc::blue   : os<<ioscc::_sesc<<ioscc::_sblue;  break;
    case ioscc::green  : os<<ioscc::_sesc<<ioscc::_sgreen; break;
  }
  _colored_stream colos={os};
  return colos;
}

template <typename T>
_colored_stream operator<< (_colored_stream os, const T     &rhs)
{
  os.os << rhs;
  return os;
};
template <>
_colored_stream operator<< (_colored_stream os, const ioscc::TColorCode &ccode)
{
  os.os << ioscc::_sesc<<ioscc::_sreset;
  os.os << ccode;
  return os;
};
_colored_stream operator<< (_colored_stream os, std::ostream& (*__pf)(std::ostream&))
{
  os.os << ioscc::_sesc<<ioscc::_sreset;
  __pf(os.os);
  return os;
};

こんな感じで使う (iomanip を include しておく必要がある):

  cout<<ioscc::red<<setw(10)<<"赤"<<ioscc::blue<<setw(10)<<"青"<<endl;
  cout<<ioscc::green<<"GREEN"<<ioscc::blue<<" BLUE"<<flush;
  cout<<" DEFAULT"<<endl;
  cout<<ioscc::green<<setprecision(20)<<3.14159265358979323846l<<endl;

すると,

        赤        青

GREEN BLUE DEFAULT

3.1415926535897932385

こんなふうに表示される.




Last-modified:2014-12-30 (Tue) 19:30:55 (3806d)
Site admin: Akihiko Yamaguchi.
Written by: Akihiko Yamaguchi.
System: PukiWiki 1.5.0. PHP 5.2.17. HTML conversion time: 0.008 sec.