我正在编写一个实验性网络程序,基本上是一个学习网络的测试程序。我在带有 mingw 的 Code::Blocks 中使用 SDL 和 SDL_net,因此控制台输出被定向到 stdout.txt。我四处搜索,发现您可以通过在 SDL_Init() 之后包含来解决此问题:
freopen("CON", "w", stdout); //stops redirect of output
freopen("CON", "w", stderr); //and errors...
这非常有效,但仅当在 IDE 中构建和运行程序时:在 IDE 之外运行时(例如双击程序)程序运行正常,但控制台输出除外,它仍然是空白.由于该程序应该是一个控制台程序,这是一个严重的问题...我不想总是在 IDE 中运行该程序才能使用它。
任何解决方案都值得赞赏,但我更希望它是对代码的更改,尽管在紧要关头一个批处理文件就可以了(我读过几篇文章,其中这是唯一有效的方法,但他们没有没有详细介绍,所以我无法复制它)。谢谢。
最佳答案
对于 (MinGW) SDL 2.0 用户
SDL 2.0 默认禁用控制台,或者更确切地说,它不启用它。
由于使用 -mwindows
进行编译会禁用控制台,因此 stdout 不会指向任何内容。 SDL_Log 有点高级,可以使用 Windows API 找到控制台,但它无法捕获标准输入,因为 cmd.exe
偷走了它:(。
由于各种原因,SDL 未声明控制台,很可能是因为该程序是使用 -mwindows
编译的。将 WinMain
指定为入口点也可能使 cmd.exe
回收控制台。根据我的阅读,SDL_main
可能会重定向 stdout 和 stderr。
你可能可以通过 #undef
'ing main 和/或
- 在
SDL_init(...); 之后调用
AllocConsole();
; - 使用
freopen("CON", stdout)
- 在没有
-mwindows
的情况下编译(#undef
'ingmain
似乎没有任何效果)
但你真的应该将 stdout 重定向到例如猫,main | cat
(始终遵循“除非必须,否则不要#undef
main”的规则)。
TL;博士
要为 MinGW 捕获 stdout
,只需将您的程序重定向到 cat
:main |猫
。这是一个 hack,它只是确保 stdout 和 stderr 不指向任何内容。
要同时捕获 stdin
和 stdout
,请在不使用 -mwindows 的情况下进行编译以创建 Windows 控制台应用程序。如有必要,这将打开一个新窗口。
注意:使用上述方法之一时刷新输出尤为重要。无论如何,依赖行缓冲是不好的做法。
关于c++ - SDL Console 输出在调试时有效,但在使用 exe 运行时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14593783/