在AllocConsole之前执行std :: endl不会导致显示std :: cout

时间:2013-09-20 10:26:57

标签: c++ windows

我正在尝试使用传统的RedirectIOToConsole函数在Windows Visual 2012,Linker / Subsystem = Windows(/ SUBSYSTEM:WINDOWS)上的输出控制台上重定向跟踪。

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

以下是我的测试:

#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;
}
  • 按原样运行 - 在控制台窗口中输出:

重定向控制台

我的踪迹2 - &GT;行

  • 取消注释测试1的行 - 在控制台窗口中输出:

重定向控制台

我的踪迹2 - &GT;行

  • 取消注释测试2的行 - 在控制台窗口中输出:

重定向控制台 - &GT; NOK

1 个答案:

答案 0 :(得分:11)

在致电RedirectIOToConsole()之前,cout无法输出。由于cout被缓冲,因此输出存储在缓冲区中,直到执行flush为止。 endl包含flush

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

然后当你执行cout << "My Trace 2" << endl;的下一步时输出没有继续,因为在实际将数据写入输出文件(stdout)之前,cout检查iostate并说“哦,这不好,我们有badbit设置“并且没有尝试编写就挽救了。

理论上,您可以通过调用cout.clear();来解决此问题,但我建议在分配控制台之前不要调用cout是一个更好的计划 - 它没有用于输出内容的目的在你有什么要输出之前。