#cpp #console #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 + "\n").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 в не консольном приложении? Так как я начинающий программист, хотелось услышать мнение профи о том нужна ли вообще отладочная консоль и если нет то что тогда используют профи или может я не правильно работаю с консолью, как вообще нужно делать правильно и грамотно?
Ответы
Ответ 1
О том как выводить русский текст в консоль написано тут - Русский язык в консоли. Однако, судя по всему Вы используете консоль только для логов. В Windows для этого есть система отладочного вывода, а именно функция OutputDebugStringW, вывод которой можно смотреть в отладчике, или в утилите DebugView. Способ, который используется в промышленном программировании - это библиотеки логов. Развитые системы логирования поддерживают различные приемники логов, в т.ч. stdout/stderr и OutputDebugString.
Комментариев нет:
Отправить комментарий