gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:40:50 25 4
gpt4 key购买 nike

我正在尝试使用经典的 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 的注释行 - 在控制台窗口中输出:

重定向控制台-> 不同意

最佳答案

在你打电话之前RedirectIOToConsole() cout 没有任何内容输出到。自 cout被缓冲,输出存储在缓冲区中直到 flush被执行。 endl包含 flush .

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

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

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

关于c++ - 在 AllocConsole 之前执行 std::endl 会导致不显示 std::cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com