c++ - freopen_s ("conout$") 和 fclose

标签 c++ c windows freopen

Visual C++ 报告向 fclose 传递了一个无效参数,该参数是 freopen_s 返回的 FILE*:

#include <WinSock2.h>
#include <iostream>

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(nCmdShow);

#ifdef _DEBUG
    AllocConsole();
#else
    AttachConsole(ATTACH_PARENT_PROCESS);
#endif

    FILE* pCout;
    freopen_s(&pCout, "conout$", "w", stdout); //returns 0

    fclose(pCout);

#ifdef _DEBUG
    system("pause");
#endif

    FreeConsole();

    return 0;
}

我不应该尝试在程序结束时关闭 conout$ 吗?是否因为文件指针在所有控制台输出的进程之间共享而引发异常?

最佳答案

fclose 的调用失败,因为您传递了一个空 FILE*FILE* 为空,因为对 freopen_s 的调用失败。该调用失败,因为该进程没有要打开的控制台。

您的程序可以在调试版本中运行,因为您调用 AllocConsole 为您的进程分配控制台。您的程序在发布版本中不起作用,因为您没有调用 AllocConsole;您调用 AttachConsole,如果父进程没有控制台,它将失败(并且无效)。

关于c++ - freopen_s ("conout$") 和 fclose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20158478/

相关文章:

c - 在C中格式化SprintF

c - 如何在 mac 10.7 和/或 10.8 上编译 pam_radius

windows - 在 Vim 的 BufWritePost 上将光标更改为另一个窗口

c++ - 重新激活旧项目时找不到QtCore中的标题

c++ - boost::bind 与成员函数(作为 boost::asio 异步写处理程序)

c++ - 空数组中的最小元素

c++ - 跨平台编程

c++ - 如何在一系列 boost::function 对象上使用 std::for_each?

c - 从命令提示符运行 Hello World C 代码?

node.js - 如何在 Windows 10 上修复错误 : spawn UNKNOWN with node. js v7.8.0?