Как обнаружить перенаправление ввода / вывода "stdout" / "sterr" с Windows - PullRequest
0 голосов
/ 09 февраля 2020

Мне нужен точный Unicode-вывод на консоль. Если я добавлю wcout к «en_US.UTF8», символы будут сопоставлены с UTF-8, но они не будут правильно отображаться на консоли. Поэтому я написал небольшую вспомогательную функцию:

void writeOutput( wchar_t const *str, bool err )
{
    static mutex      mtx;
    lock_guard<mutex> lock( mtx );
    wstringstream wss;
    wss << str << L"\n";
    wstring strFmt = move( wss.str() );
    DWORD   dwWritten;
    WriteConsoleW( GetStdHandle( !err ?  STD_OUTPUT_HANDLE : STD_ERROR_HANDLE ), strFmt.c_str(), wcslen( strFmt.c_str() ), &dwWritten, nullptr );
}

Эта функция правильно отображает символы Юникода. Но если я делаю перенаправление ввода / вывода с помощью «program> outfile», в файле ничего не записывается. Итак, как мне определить, есть ли перенаправление?

1 Ответ

0 голосов
/ 11 февраля 2020

Итак, как мне определить, есть ли перенаправление?

Как указывал @Remy Lebeau, функция GetFileType вернет FILE_TYPE_DISK ( указанный файл является дисковым файлом.) если вывод консоли был перенаправлен в файл.

Ниже описано, как это сделать в C ++:

DWORD nType = GetFileType(GetStdHandle(err ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE));
if (FILE_TYPE_DISK == nType)
{
    printf("Output to a disk file.");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...