2013-11-16 5 views
2

Можно ли сделать функцию-обертку, где я могу передать последние два аргумента fprintf, таких как _Format и ... и сделать что-то вроде следующего:«fprintf» Формат цвета обертка

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); 
} 
+0

вы можете, например, использовать [rlutil] (https://github.com/tapio/rlutil) заголовка только библиотеку, и да, нет никакой необходимости использовать 'fprintf' в ваш случай, просто используйте более безопасный поток 'cout'. –

+0

Выполняет ли 'SetConsoleTextAttribute' вывод данных перед настройкой атрибутов? Если нет, вы должны вручную очистить вывод перед его вызовом, иначе неправильный текст может закончиться вашим выбранным цветом. – youdontneedtothankme

ответ

2

Да, но вы должны использовать vfprintf версию printf и инициализировать 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);  
} 
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

+0

Я предпочитаю 'fprintf' над' cout' why 'should "должен ли я использовать его вместо этого? –

+1

Не стоит вступать в спор по стилю кодирования на этом сайте. Многие люди находят код с использованием 'cout' более читабельным. Если вы не один из тех людей, и вы не работаете с кем-либо из этих людей, не стесняйтесь использовать 'fprintf'. Все будет хорошо. – godel9

Смежные вопросы