Я пишу экспериментальную сетевую программу, в основном тестовую программу для изучения сетей. Я использую SDL и SDL_net в Code :: Blocks с mingw, поэтому вывод консоли направлялся в stdout.txt. Я искал вокруг и обнаружил, что вы можете исправить это, в том числе после SDL_Init ():
freopen("CON", "w", stdout); //stops redirect of output
freopen("CON", "w", stderr); //and errors...
Это работало отлично, но только при сборке и запуске программы в IDE: при запуске вне среды IDE (например, двойной щелчок по программе) программа работает правильно, за исключением вывода на консоль, который по-прежнему пуст. Так как программа должна быть консольной, это серьезная проблема … Я не хочу всегда запускать программу в IDE, чтобы использовать ее.
Любое решение ценится, но я бы предпочел, чтобы это было изменение кода, хотя в крайнем случае подойдет командный файл (я прочитал пару постов, где это единственное, что работает, но они не пошли в деталях, поэтому я не могу воспроизвести его). Благодарю.
Вы смотрели на FAQ по консоли 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
код для вашего проекта и прекратить ссылки на библиотеку.
SDL 2.0 отключает консоль по умолчанию, точнее, не включает ее.
С момента компиляции с -mwindows
отключает консоль, stdout ни на что не указывает. SDL_Log немного интереснее и может найти консоль с помощью Windows API, но не может захватить стандартный ввод, потому что cmd.exe
украл :(.
SDL не требует консоли по разным причинам, скорее всего потому, что программа была скомпилирована с -mwindows
, Определение WinMain
как точка входа может также сделать cmd.exe
вернуть консоль. Из того, что я прочитал SDL_main
может перенаправить стандартный вывод и стандартный вывод.
Вы могли бы сойти с рук #undef
в основном и / или
AllocConsole();
после SDL_init(...);
freopen("CON", stdout)
-mwindows
(#undef
«ИНГ main
кажется, не имеет никакого эффекта)но вы должны просто перенаправить стандартный вывод, например, на кот, с main | cat
(Всегда следуйте правилу «Не #undef
главное если не надо «).
Захватить stdout
для MinGW, просто перенаправьте вашу программу на cat
: main | cat
, Это хак, который просто гарантирует, что stdout и stderr ни на что не указывают.
Чтобы захватить оба stdin
а также stdout
, без компиляции -mwindows создайте консольное приложение Windows. Это откроет новое окно при необходимости.
Примечание: особенно важно сбрасывать вывод при использовании одного из вышеуказанных методов. В любом случае полагаться на буферизацию строки — это плохая практика.
(Я не мог опубликовать это вчера, потому что у меня не было достаточно репутации)
Хорошо, немного поэкспериментировал со строками командного файла. Мой полученный и (почти) рабочий пакетный файл:
program.exe
Не понимал, что это будет так просто, но все еще не могу понять, почему двойной щелчок по программе не работает. Я сказал, что почти работает, потому что после подключения клиента к серверу консоль отключается, поэтому проблема остается. Так что я все равно буду признателен за любую помощь в решении этой проблемы.
(Конец вчерашнего предполагаемого поста)
(Начало сегодняшнего ответа)
Я попробовал предложения Emartel, но это все равно не сработало. Провел некоторое тестирование и обнаружил, что бесконечный цикл печати пустой строки вызывал проблему пустого экрана после подключения клиента. Исправлен цикл, и теперь он работает правильно, хотя мне все еще нужно использовать пакетный скрипт.
Был бы признателен, если бы кто-нибудь когда-нибудь выяснил, почему двойной щелчок не работает.
Две причины:
С SDL консоль отключена. SDL использует окна, а не консоли.
SDL перенаправляет стандартный вывод (cout и printf ()) в файл с именем stdout.txt в той же папке, где находится каталог * .exe.
Ты можешь использовать:
std::cout << "Hello World";
И сообщение будет храниться в файле stdout.txt.