【问题标题】:Doing a std::endl before AllocConsole causes no display of std::cout在 AllocConsole 之前执行 std::endl 会导致不显示 std::cout
【发布时间】:2013-09-22 20:09:38
【问题描述】:

我正在尝试使用经典的 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 -> 好的

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

重定向控制台

我的踪迹 2 -> 好的

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

重定向控制台 -> 挪威克朗

【问题讨论】:

  • std::cout 被缓冲,std::endl; 刷新缓冲区。希望对您有所帮助,因为我根本不理解问题/问题。
  • 您应该做的第一件事是检查您正在调用的函数中的错误。如果它们指示错误,您可能需要检查是什么错误(例如,GetLastError 代表 AllocConsole 或返回值 freopen_s)。

标签: c++ windows


【解决方案1】:

在您调用 RedirectIOToConsole() 之前,cout 没有任何内容可以输出。由于cout 被缓冲,所以输出存储在缓冲区中,直到执行flushendl 包含一个 flush

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

当您执行cout &lt;&lt; "My Trace 2" &lt;&lt; endl; 的下一步时,输出不会继续,因为在实际将数据写入输出文件(stdout)之前,cout 检查iostate 并说“哦,这不好,我们有badbit 设置”并且在不尝试写的情况下退出。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多