簡體   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