Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何检测“的I/O重定向”;stdout";/&引用;斯特尔;有窗户_Winapi - Fatal编程技术网

Winapi 如何检测“的I/O重定向”;stdout";/&引用;斯特尔;有窗户

Winapi 如何检测“的I/O重定向”;stdout";/&引用;斯特尔;有窗户,winapi,Winapi,我需要精确的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 <

我需要精确的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 );
}
void writeOutput(wchar\u t const*str,bool err)
{
静态互斥;
锁和防护锁(mtx);
wstringstreamwss;
wss
那么我如何检测是否存在重定向

正如@Remy Lebeau alreay指出的,如果控制台输出已重定向到文件,则函数将返回
文件\类型\磁盘
(指定的文件是磁盘文件)

以下是如何在C++中执行的操作:

DWORD nType = GetFileType(GetStdHandle(err ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE));
if (FILE_TYPE_DISK == nType)
{
    printf("Output to a disk file.");
}

在Windows上,通常可以使用
GetFileType()
GetConsoleMode()
来检测重定向,而不是使用UTF-8语言环境。StackOverflow上有几个问题(在其他语言中)讨论了这一点,例如。嗨,Bonita Montero,如果它解决了您的问题,您可以。