2011-02-07 5 views
6

में stdout/stderr टेक्स्ट रंग सेट करना मैंने system("color 24"); का उपयोग करने का प्रयास किया लेकिन इससे प्रॉम्प्ट में रंग नहीं बदला। तो अधिक Googling के बाद मैंने SetConsoleTextAttribute देखा और नीचे कोड लिखा था।विंडोज

दोनों stdout और stderr में यह परिणाम दोनों लाल जा रहा है stdout हरी जा रहा है और stderr के बजाय लाल रंग हो रही।

मैं इसे कैसे हल करूं? मेरा प्रॉम्प्ट अब भी लाल है लेकिन मुझे इसकी परवाह नहीं है क्योंकि मुझे पता है कि इसे कैसे ठीक किया जाए।

विंडोज 7 में काम करना चाहिए पल मैं शीघ्र से निर्माण कर रहा हूँ पर (VS 2010 सीएल प्रयोग करके) और एक नियमित cmd शीघ्र

#include <windows.h> 
#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    int i; 
    unsigned long totalTime=0; 


    HANDLE hConsoleOut; //handle to the console 
    hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    SetConsoleTextAttribute(hConsoleOut, FOREGROUND_GREEN); 

    HANDLE hConsoleErr; 
    hConsoleErr = GetStdHandle(STD_ERROR_HANDLE); 
    SetConsoleTextAttribute(hConsoleErr, FOREGROUND_RED); 

    fprintf(stdout, "%s\n", "out"); 
    fprintf(stderr, "%s\n", "err"); 
    return 0; 
} 

उत्तर

5

एमएसडीएन GetStdHandle() दस्तावेज़ीकरण के अनुसार, फ़ंक्शन एक ही सक्रिय कंसोल स्क्रीन बफर पर हैंडल वापस कर देगा। इसलिए इन हैंडल का उपयोग करके विशेषताएँ सेट करना हमेशा एक ही बफर बदल जाएगा। इस वजह से आप इससे पहले कि आप सही आउटपुट डिवाइस के लिए सही रंग निर्दिष्ट करने के लिए है:

/* ... */ 

HANDLE hConsoleOut; //handle to the console 
HANDLE hConsoleErr; 
hConsoleErr = GetStdHandle(STD_ERROR_HANDLE); 
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); 
SetConsoleTextAttribute(hConsoleOut, FOREGROUND_GREEN); 
fprintf(stdout, "%s\n", "out"); 

SetConsoleTextAttribute(hConsoleErr, FOREGROUND_RED); 
fprintf(stderr, "%s\n", "err"); 
return 0; 
+0

मैं शपथ ले सकता था कि मैंने कोशिश की। स्वीकार किए जाते हैं –

0

कोशिश इसे चलाने प्रत्येक उत्पादन से पहले रंग सेट करने के । कोड डुप्लिकेशन से बचने के लिए आप इसे फ़ंक्शन में कर सकते हैं।

5

त्रुटि और सामान्य सांत्वना उत्पादन के लिए संभाल ही हैं। या अधिक की तरह, वे एक ही कंसोल विंडो को इंगित करते हैं। जब आप कंसोल रंग बदलते हैं, तो यह उसके बाद लिखे गए सभी पाठों पर लागू होता है, इसलिए आउटपुट से पहले आपको रंग बदलना होगा। यदि आप अपने द्वारा आउट किए गए प्रत्येक पाठ के लिए ऐसा नहीं करना चाहते हैं, तो कॉल को एक अलग फ़ंक्शन में पैक करें:

#include <windows.h> 
#include <stdio.h> 
// global vars (better pack it in a class) 
// initialize both to normal white color 
#define FOREGROUND_WHITE (FOREGORUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN) 
int g_console_out_color = FOREGROUND_WHITE; 
int g_console_err_color = FOREGROUND_WHITE; 
HANDLE g_console_out_handle = GetStdHandle(STD_OUTPUT_HANDLE); 
HANDLE g_console_err_handle = GetStdHandle(STD_ERROR_HANDLE); 

void SetConsoleOutColor(int color){ 
    g_console_out_color = color; 
} 

void SetConsoleErrColor(int color){ 
    g_console_err_color = color; 
} 

void PrintOut(const char* format, ...){ 
    SetConsoleTextAttribute(g_console_out_handle, g_console_out_color); 
    va_list args; 
    va_start(args, str); 
    fprintf(stdout, format, args); 
    va_end(args); 
    // set color back to normal 
    SetConsoleTextAttribute(g_console_out_handle, FOREGROUND_WHITE); 
} 

void PrintErr(const char* format, ...){ 
    SetConsoleTextAttribute(g_console_err_handle, g_console_err_color); 
    va_list args; 
    va_start(args, str); 
    fprintf(stderr, format, args); 
    va_end(args); 
    // set color back to normal 
    SetConsoleTextAttribute(g_console_err_handle, FOREGROUND_WHITE); 
} 

int main(void){ 
    PrintOut("%s\n", "out"); 
    PrintErr("%s\n", "err"); 
}