Страницы

Поиск по вопросам

четверг, 7 марта 2019 г.

отладочная консоль и windows 10

Раньше, когда я не перешел на "вин 10", я всегда использовал в своих программах вот такой простенький код для создания консоли в не консольных приложениях(код работал в вин 7,8,8.1):
void createConsole() { setlocale(0, "Russian"); int hConHandle; long lStdHandle; FILE *fp; AllocConsole(); lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen(hConHandle, "w"); *stdout = *fp; setvbuf(stdout, NULL, _IONBF, 0); }
Выводил в консоль данные с помощью обычного "printf", далее я перешел на вин 10 и испробовал скомпилировать свой проект на этой платформе - со старым кодом. К моему удивлению в не консольном приложении нечего в консоль не вывелось, а в консольном посредством функции "printf" вывелось - но я не смог вывести русский шрифт не смотря на то, что я задал кириллицу "setlocale(0, "Russian");". Далее погуглив на счет кодировки я все же смог выставить "русскую кодировку" в консольном приложении:
//Устанавливаем русский язык if (system("chcp 1251")) { message("Не удалось установить русский язык в консоле!"); }
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода setlocale(LC_ALL, "Russian");
Проблема заключалась в следующем, мне консоль очень нужна в "не консольном" приложении и погуглив я нашел другой код для создания и вывода данных в консоль на "msdn":
HANDLE handle; void createConsole(){ AllocConsole(); handle = GetStdHandle(STD_OUTPUT_HANDLE); }
bool write(std::string description, ...) { char buf[1024]; memset(buf, 0, sizeof(buf));
va_list vaList; va_start(vaList, description); vsprintf_s(buf, (description + "
").c_str(), vaList); va_end(vaList);
if (WriteConsoleA(handle, buf, strlen(buf), 0, 0) == 0) {
return false; }
return true; }
Консоль работает- все данные выводятся - но я не могу выводить русские символы в консоль, даже этот код не помогает и не могу выводить информацию через "printf":
//Устанавливаем русский язык if (system("chcp 1251")) { message("Не удалось установить русский язык в консоле!"); }
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода setlocale(LC_ALL, "Russian");
Собственно вопросы:
Почему в вин 10 перестал работать старый код для создания консоли? Почему я не могу выводить кириллицу в новую консоль и может ли это зависеть от языкового пакета установленного на мою винду 10? Почему не могу выводить данные через printf в не консольном приложении?
Так как я начинающий программист, хотелось услышать мнение профи о том нужна ли вообще отладочная консоль и если нет то что тогда используют профи или может я не правильно работаю с консолью, как вообще нужно делать правильно и грамотно?


Ответ

О том как выводить русский текст в консоль написано тут - Русский язык в консоли
Однако, судя по всему Вы используете консоль только для логов. В Windows для этого есть система отладочного вывода, а именно функция OutputDebugStringW, вывод которой можно смотреть в отладчике, или в утилите DebugView
Способ, который используется в промышленном программировании - это библиотеки логов. Развитые системы логирования поддерживают различные приемники логов, в т.ч. stdout/stderr и OutputDebugString

Комментариев нет:

Отправить комментарий