Раньше, когда я не перешел на "вин 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
Комментариев нет:
Отправить комментарий