我正在尝试使用传统的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;行
重定向控制台
我的踪迹2 - &GT;行
重定向控制台 - &GT; NOK
答案 0 :(得分:11)
在致电RedirectIOToConsole()
之前,cout
无法输出。由于cout
被缓冲,因此输出存储在缓冲区中,直到执行flush
为止。 endl
包含flush
。
当您尝试在没有可用控制台的情况下刷新输出时,cout
流会在badbit
中设置iostate
。
然后当你执行cout << "My Trace 2" << endl;
的下一步时输出没有继续,因为在实际将数据写入输出文件(stdout)之前,cout
检查iostate
并说“哦,这不好,我们有badbit
设置“并且没有尝试编写就挽救了。
理论上,您可以通过调用cout.clear();
来解决此问题,但我建议在分配控制台之前不要调用cout
是一个更好的计划 - 它没有用于输出内容的目的在你有什么要输出之前。