在AllocConsole之前做一个std :: endl不会显示std :: cout

我正在尝试使用经典的RedirectIOToConsole函数在Windows Visual 2012,链接器/子系统= Windows(/ SUBSYSTEM:WINDOWS)上redirect输出控制台上的跟踪。

AllocConsole之前执行std :: endl似乎导致问题显示痕迹。

以下是我的testing:

#include <windows.h> #include <stdio.h> #include <iostream> void RedirectIOToConsole() { FILE *conin, *conout; AllocConsole(); freopen_s(&conin, "conin$", "r", stdin); freopen_s(&conout, "conout$", "w", stdout); freopen_s(&conout, "conout$", "w", stderr); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { // std::cout << "My Trace 1"; // Uncomment this line for Test 1 // std::cout << "My Trace 1" << std::endl; // Uncomment this line for Test 2 RedirectIOToConsole(); printf( "redirected console\n"); std::cout << "My Trace 2" << std::endl; ch = getchar(); return 0; } 
  • 按照原样运行 – 在控制台窗口中输出:

redirect的控制台

我的跟踪2 – >确定

  • 取消对testing1的注释行 – 在控制台窗口中输出:

redirect的控制台

我的跟踪2 – >确定

  • 取消对testing2的注释行 – 在控制台窗口中输出:

redirect控制台 – > NOK

Solutions Collecting From Web of "在AllocConsole之前做一个std :: endl不会显示std :: cout"

在调用RedirectIOToConsole()之前, cout不能输出到任何地方。 由于cout被缓冲,输出被存储在缓冲区中,直到执行flushendl包含一个flush

当您尝试刷新没有可用的控制台的输出时, cout流设置badbit中的iostate

当你做下一步的cout << "My Trace 2" << endl; 输出没有进行,因为在实际将数据写入输出文件(stdout)之前, cout检查iostate并且说:“哦,这个不好,我们有badbit ”,并且没有尝试写入而退出。

理论上,你可以通过调用cout.clear();解决这个问题cout.clear(); ,但是我建议在分配一个控制台之前不要调用cout是一个更好的计划 – 在输出之前没有任何目的输出东西。