I'm on your side, when times get rough.

2018.01.11

[C/C++] printf / std::cout with Colour

Filed under: Programming — Peter_KIM @ 09:02

GUI 운영 체제가 대세이긴 하지만, DOS 환경을 겪었던 오래된 프로그래머에게는 명령 프롬프트(터미널) 창이 더 편리한 경우가 많이 있습니다. 리눅스 서버에서 작업하는 경우에는 필수겠지만, 사실 윈도우에서도 가끔은 명령 프롬프트 창이 편리할 때도 많이 있습니다.

Console 창에서 printf  또는  cout 함수를 이용하여, 색깔이 있는 글자를 출력하기 위해서 코드를 만들어 보았습니다.
윈도우의 명령 프롬프트에서는 Escape 문자(ANSI 코드)가 동작하지 않아서, Win32 API 기능을 이용하여, 색깔을 표시할 수 있습니다.
std::cout 함수를 printf 함수로 교체하고, std::ostringstream 함수를 sprintf 함수로 교체하여 손질하면, C 코드에서도 사용할 수 있습니다.

#include <stdio.h>
#include <sstream>
#include <iostream>
 
#ifdef _WIN32
    #include <windows.h> 
#endif
 
#ifdef _WIN32
enum ForeColour {
    Default    = 0x0008,
    Black      = 0x0000,
    Blue       = 0x0001,
    Green      = 0x0002,
    Cyan       = 0x0003,
    Red        = 0x0004,
    Magenta    = 0x0005,
    Yellow     = 0x0006,
    White      = 0x0007,
};
#else
enum ForeColour {
    Default    = 0,
    Black      = 30,
    Red        = 31,
    Green      = 32,
    Yellow     = 33,
    Blue       = 34,
    Magenta    = 35,
    Cyan       = 36,
    White      = 37,
};
#endif
 
void PrintConsole(const char *lpszText, short nColor)
{
#ifdef _WIN32
    HANDLE  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, nColor | 0x0008);
#else
    std::ostringstream oss;
    oss << "\033[1;" << nColor << "m";
    std::cout << oss.str();
#endif
 
    std::cout << lpszText;
 
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, 0x0008);
#else
    std::cout << "\033[0m";
#endif
}
 
int main()
{
   PrintConsole("Black"  , ForeColour::Black);
   PrintConsole("Red"    , ForeColour::Red);   
   PrintConsole("Green"  , ForeColour::Green); 
   PrintConsole("Yellow" , ForeColour::Yellow);
   PrintConsole("Blue"   , ForeColour::Blue);  
   PrintConsole("Magenta", ForeColour::Magenta);
   PrintConsole("Cyan"   , ForeColour::Cyan); 
   PrintConsole("White"  , ForeColour::White); 
 
   return 0;
}
Advertisements

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

Blog at WordPress.com.

%d bloggers like this: