Страницы

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

воскресенье, 12 января 2020 г.

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

#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.

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

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