SDL控制台输出在调试时有效,但在使用exe运行时无效

时间:2013-01-29 23:09:10

标签: c++ console sdl codeblocks freopen

我正在编写一个实验性网络程序,基本上是一个学习网络的测试程序。我在使用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中运行该程序来使用它。

任何解决方案都是一种解决方案,但我更希望它是对代码的更改,尽管在批处理文件中可以做一些(我已经阅读了几个帖子,这是唯一可行的,但是他们没有我会详细介绍,所以我无法复制它。感谢。

4 个答案:

答案 0 :(得分:2)

对于(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主要和/或

  • AllocConsole();
  • 之后致电SDL_init(...);
  • 使用freopen("CON", stdout)
  • 在没有-mwindows的情况下进行编译(#undef' main似乎没有任何效果)

但你应该只是将stdout重定向到例如猫,main | cat(始终遵循规则"不要#undef为主,除非你必须")。

TL; DR

要捕获MinGW的stdout,只需将您的计划重定向到catmain | cat即可。这是一个黑客,只是确保stdout和stderr没有指向任何东西 要同时捕获stdinstdout,请在不使用-mwindows的情况下编译以创建Windows控制台应用程序。如有必要,这将打开一个新窗口。

注意:使用上述方法之一时,刷新输出尤为重要。无论如何,依靠线缓冲是不好的做法。

答案 1 :(得分:1)

(我昨天不能发帖,因为我没有足够的声誉)

好的,对批处理文件的行进行了一些实验。我的结果和(几乎)工作批处理文件:

program.exe

没有意识到这将是这么简单,但仍然无法理解为什么双击该程序不起作用。我说几乎工作,因为在客户端连接到服务器后控制台空白,所以仍然存在问题。所以,我仍然会对这个问题提供任何帮助。

(昨天的预期结束)

(开始今天的回答)

我尝试了Emartel的建议,但它仍然没有用。做了一些测试并发现打印空字符串的无限循环导致连接客户端后出现空白屏幕问题。修复了循环,现在它正常工作,虽然我仍然需要使用批处理脚本。

如果有人弄清楚为什么双击不起作用,那么会不会知道。

答案 2 :(得分:0)

您是否看过SDL Console FAQ

他们提供了许多建议,包括:

首先尝试

freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );

如果不起作用(如您的情况),请尝试

#include <fstream>
#include <iostream>
using namespace std;
....
ofstream ctt("CON");
freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );
...
ctt.close();

OR

FILE * ctt = fopen("CON", "w" );
freopen( "CON", "w", stdout );
freopen( "CON", "w", stderr );
...
ctt.close();

另一种选择是重新编译SDLmain库或将SDLmain代码添加到项目中并停止链接到库。

答案 3 :(得分:0)

有两个原因:

  • 使用SDL,控制台被禁用。 SDL使用的是Windows而非控制台。

  • SDL将标准输出(cout和printf())重定向到* .exe所在目录的同一文件夹中名为stdout.txt的文件。

您可以使用:

std::cout << "Hello World";

该消息将存储在stdout.txt文件中。