Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.103.10] |
|
Сообщ.
#1
,
|
|
|
Хочу замутить манипулятор на тему цветного текста для консольной проги под Вин32 (пока без танцев на тему "познакомить ostream и новый манипулятор"):
cout.flush(); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); Вопрос: как определить, что cout не переназначен куда-нить в файл, а реально прицеплен к консоли? |
Сообщ.
#2
,
|
|
|
Курение сырцов библиотек и МСДН к просветлению не привело. Хелп, плиз!!!
P.S. Манипуляторы написаны. Только хочется всё-таки добавить проверку на переназначенный вывод, чтобы даром не теребить SetConsoleTextAttribute(). |
Сообщ.
#4
,
|
|
|
Цитата Алкаш @ barazuk, а это не то чт тебе надо? Нет, не то. Вопрос не в установке цвета и не в "написать манипулятор" - это нам, гусарам, как два пальца об асфальт (дарю всем ): #include <iostream.h> #include <windows.h> inline ostream& __cdecl green(ostream& _O){ _O.flush(); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN); return (_O); } inline ostream& __cdecl red(ostream& _O){ _O.flush(); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED); return (_O); } inline ostream& __cdecl white(ostream& _O){ _O.flush(); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE ); return (_O); } int main(int argc, char ** argv) { cout << green << "Green text " << red << "Red text " << endl; cout << white << "White text " << endl; return 0; } Вопрос в том, что делать, есло cout у нас перенаправлен в файл - чтобы даром не теребить SetConsoleTextAttribute(). |
Сообщ.
#5
,
|
|
|
Так что, товарищи, считать, что невозможное - невозможно?
|
Сообщ.
#6
,
|
|
|
Ну, почему же....
bool IsRedirectedStdOutput() { HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); BY_HANDLE_FILE_INFORMATION fi; return FALSE != GetFileInformationByHandle(hStdOut, &fi); } |
Сообщ.
#7
,
|
|
|
Гм... А дополнительную дуракозащиту всё-таки по отношению к самому ostream никак нельзя применить? Потому что манипулятор же не знает, в принципе, куда его пхнули - в stdout, в stderr, или в самой проге сделано что-нить типа
... cout = my_pretty_stdio_ostream; ... |
Сообщ.
#8
,
|
|
|
Цитата barazuk @ дополнительную дуракозащиту всё-таки по отношению к самому ostream никак нельзя применить? Нельзя. Хендл хранится в basic_filebuf в закрытом поле и доступа к нему не получить. |
Сообщ.
#9
,
|
|
|
Жаль
|