SDL控制台输出工程调试运行时,而不是在与exe文件运行(SDL Console output wo

2019-08-08 19:21发布

我写一个实验性的组网方案,基本上是学习网络测试程序。 我使用SDL和SDL_net在代码:: Blocks的使用MinGW,所以控制台输出被定向到stdout.txt。 我搜索了四周,发现可以通过包括SDL_Init()后,解决这个问题:

freopen("CON", "w", stdout); //stops redirect of output
freopen("CON", "w", stderr); //and errors...

这完美地工作,但只有建立在IDE中运行该程序时:IDE的(在程序如双击)之外运行,当程序正常运行,与控制台输出,这仍然是空白的除外。 作为该计划被认为是一个控制台程序,这是一个严重的问题......我不希望有始终运行在IDE中的程序来使用它。

任何解决方案是apreciated但我宁愿它是一个改变的代码,但在紧要关头,一个批处理文件会做(我读了一些文章,其中这是唯一可行的事情,但他们没有去到很多细节,所以我不能复制它)。 谢谢。

Answer 1:

你看看在SDL控制台常见问题 ?

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

第一次尝试

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();

要么

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

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



Answer 2:

对于(MinGW的)SDL 2.0用户

SDL 2.0在默认情况下禁用控制台,或者更确切地说,它不会启用它。 由于与编译-mwindows禁用控制台,标准输出不指向任何东西。 SDL_Log是一个小票友,可以找到使用Windows API控制台,但它不能捕捉标准输入,因为cmd.exe偷走了:(。

SDL不要求控制台由于种种原因,很可能是因为该程序被编译-mwindows 。 指定WinMain为切入点,也可能使cmd.exe回收控制台。 从我读过SDL_main可能重定向输出和错误。

你也许可以逃脱#undef “荷兰国际集团主,和/或

  • 调用AllocConsole();SDL_init(...);
  • 使用freopen("CON", stdout)
  • 编译不-mwindows#undef “荷兰国际集团main似乎没有产生任何影响)

但你应该真的只是stdout重定向到如猫,与main | cat main | cat (始终遵循规则“不要#undef主,除非你要”)。

TL; DR

要捕获stdout为MinGW的,只要将您的计划,以catmain | cat main | cat 。 这是一个黑客简单地确保输出和错误不点什么。
为了捕捉这两个stdinstdout ,编译不-mwindows创建一个Windows控制台应用程序。 如有必要,这将打开一个新窗口。

注意:在使用上述方法之一,当冲洗输出这是特别重要的。 依托行缓冲是不好的做法呢。



Answer 3:

(我不能因为我没有足够的声誉这个昨天发布)

好了,做了一个小实验,在批处理文件的行。 我得到的和(几乎)工作批处理文件:

program.exe

没想到会是这样简单,但仍然无法理解为什么在程序双击不起作用。 我说的话简直工作,因为客户端连接到服务器控制台空白出来后,所以还是存在问题。 所以,我还是真的apreciate这个问题的任何帮助。

(昨日的预期后完)

(今天的回答Begining)

我试图Emartel的建议,但它仍然没有奏效。 做了一些测试,发现打印空字符串的无限循环是连接客户端后导致黑屏的问题。 固定循环,现在它工作正常,但我还是要使用批处理脚本。

将apreciate知道是否有人曾经计算出为什么双击不起作用。



Answer 4:

有两个原因:

  • 随着SDL控制台被禁用。 SDL使用的窗口,而不是游戏机。

  • SDL重定向标准输出(包括COUT和printf()),以在其中的* .exe所在目录下的同一个文件夹的文件名为stdout.txt。

您可以使用:

std::cout << "Hello World";

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



文章来源: SDL Console output works when debuging, but not when run with the exe