3

我正在编写一个实验性的网络程序,基本上是一个学习网络的测试程序。我在带有 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

4 回答 4

2

对于 (MinGW) SDL 2.0 用户

SDL 2.0 默认禁用控制台,或者更确切地说,它不启用它。由于编译-mwindows禁用控制台,stdout 不指向任何东西。SDL_Log 有点花哨,可以使用 windows API 找到控制台,但它无法捕获标准输入,因为cmd.exe偷了它:(。

SDL 不认领控制台有多种原因,很可能是因为程序是用-mwindows. 指定WinMain为入口点也可能会cmd.exe回收控制台。从我读过的内容SDL_main可能会重定向标准输出和标准错误。

你可能会逃脱#undef'ing main,和/或

  • 调用AllocConsole();SDL_init(...);
  • 采用freopen("CON", stdout)
  • 编译没有-mwindows( #undef'ingmain似乎没有任何效果)

但是您实际上应该将标准输出重定向到例如 cat,使用(始终遵循“除非必须这样做,否则main | cat不要主”的规则)。#undef

TL; 博士

要为 MinGW 捕获stdout,只需将您的程序重定向到cat: main | cat。这是一个 hack,它只是确保 stdout 和 stderr 不指向任何内容。
要同时捕获stdinstdout,请在不使用 -mwindows 的情况下进行编译以创建 Windows 控制台应用程序。如有必要,这将打开一个新窗口。

Note: It is especially important to flush output when using one of the above methods. Relying on line buffering is bad practice anyway.

于 2016-04-19T08:47:44.383 回答
1

(我昨天无法发布,因为我没有足够的声誉)

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

program.exe

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

(昨天的准帖子结束)

(今天的回答开始)

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

如果有人弄清楚为什么双击不起作用,会很感激。

于 2013-01-31T00:18:14.383 回答
0

您是否查看过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代码添加到您的项目并停止链接到库。

于 2013-01-30T17:23:42.597 回答
0

两个原因:

  • 使用 SDL,控制台被禁用。SDL 使用窗口,而不是控制台。

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

您可以使用:

std::cout << "Hello World";

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

于 2013-08-03T04:31:26.227 回答