繁体   English   中英

重定向标准输出-从VS2013切换到VS2017,编写时出现异常

[英]Redirecting standard output - Switched from VS2013 to VS2017, exception on writing

我最近将一个项目从使用VS2013编译器切换到了VS2017,现在以下代码似乎无法正常工作:

#include <windows.h>
#include <Fcntl.h>
#include <io.h>
#include <iostream>
#include <exception>

if( RedirectOutput )
{
    //Setup stdout
    HANDLE handle_stdout = GetStdHandle( STD_OUTPUT_HANDLE );

    int fileDesc_stdout = _open_osfhandle( (long)handle_stdout, _O_TEXT );

    if( fileDesc_stdout == -1 )
    {
        throw std::exception( "fileDesc_stdout is not valid" );
    }

    FILE* new_stdout = _fdopen( fileDesc_stdout, "w" );

    if( !new_stdout )
    {
        throw std::exception( "new_stdout is not valid" );
    }

    FILE old_stdout = *stdout;
    *stdout = *new_stdout;

    std::cout.clear();

    std::cout << "Output Redirected!\n";
}

这段代码旨在将标准输出重定向到控制台窗口,该窗口可以是启动当前进程的窗口,也可以是通过AllocConsole创建的控制台。 (我为测试目的添加了最后一行。)

第一次写入cout时,会引发以下异常(否则将不会写入输出,并且此后会静默失败):

调试断言失败!

程序:w:\\ build \\ MyApp.exe文件:minkernel \\ crts \\ ucrt \\ src \\ appcrt \\ stdio_flsbuf.cpp行:26

表达式:(“不一致的IOB字段”,stream-> _ ptr-stream-> _ base> = 0)

有关程序如何导致断言失败的信息,请参见有关断言的Visual C ++文档。

(按重试可调试应用程序)

我可以看到stdout来自corecrt_wstdio.h,但是当我插入一个断点并添加一个监视时,它说stdout是未定义的,所以我无法检查该值。

有任何想法吗?

因此,我仔细搜索了一下,发现了关于SO的帖子。

本质上,我发布的所有代码都可以替换为以下代码:

freopen(“ CONOUT $”,“ w”,stdout);

freopen的第一个参数是文件名,所以我想知道CONOUT $ / CONIN $是否代表实际文件,或者该函数是否将该输入视为特殊情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM