'fprintf'颜色格式包装

时间:2013-11-16 13:50:34

标签: c++ colors formatting wrapper printf

是否可以创建一个包装函数,我可以传递fprintf的最后两个参数,例如_Format...,它会执行以下操作:

void Log::green(_Format, ...[args])
{
    // Set to green
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    // Print
    fprintf(stdout, _Format, args);
    // Set back to default color
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
}

2 个答案:

答案 0 :(得分:3)

是的,但您必须使用vfprintfprintf并使用args / va_start初始化va_end,如下所示:

void Log::green(const char * format, ...) 
{ 
  va_list args;
  va_start (args, format);

  // Set to green 
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                           FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  // Print
  vfprintf(stdout, format, args);
  // Set back to default color
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                          FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
  va_end (args);    
}

答案 1 :(得分:2)

首先,由于您使用的是C ++,因此您应该使用cout而不是fprintf(stdout, ...)

其次,你可以使用这样的函数:

inline std::ostream& green(std::ostream &s)
{
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(hStdout, 
              FOREGROUND_GREEN|FOREGROUND_INTENSITY);
    return s;
}

允许你编写这样的代码:

cout << "Switching to green color... " << green << "Now, I'm green!"

您可以在此处找到完整的函数库:Add color to your std::cout