How do I keep SDL from outputting stdout to a file?
Members - Reputation: 224
Posted 23 August 2005 - 08:23 AM
in the SDL source code:
So maybe you can:
Then again, this may be something you have to do when you compile SDL.
I hope this helps.
p.s. in linux it is pretty easy if I remember correctly using close(stdout); and then opening it with 0 I think.
On windows I am not sure.
Members - Reputation: 224
Posted 23 August 2005 - 09:12 AM
So I was thinking I would be clever..
*oldStdout = *stdout; //causes the application to crash :(
*stdout = *oldStdout;
I thought for sure this would work... alas, I was wrong.
If you are using windows, microsoft claims:
STDOUT 1 Output to the Command Prompt window source
If you find an answer let me know :)
If I think of anything else I will give it a try.
Posted 23 August 2005 - 09:27 AM
Try playing with the option in either General tab's or the Compiler\Linker.
Staff Emeritus - Reputation: 1982
Posted 23 August 2005 - 09:30 AM
Original post by Drakkcon
Could someone tell me how to allow stdio to use the console window?
It's platform specific, so the following is Windows only.
- Create a new console window if your app is a "Win32 Application." AllocConsole is the API you want.
- Once you have your console, retrieve its standard input (or, possibly in the future, standard output) stream handle. You want GetStdHandle.
- You then want to get a C file descriptor corresponding to said handle. Windows provides the _open_osfhandle API for exactly this purpose.
- Now retrieve a FILE * for that file descriptor: call _fdopen.
- Finally, redirect the standard I/O stream pointer with code like the following:
*stdin = *conin;where conin and conout are the FILE *s that correspond to the input and output handles of your console, respectively.
*stdout = *conout;
- One extra step is to eliminate I/O buffering, so any data printed to stdout shows up immediately (if you want). Call setvbuf with the appropriate parameters.
You can save a lot of time by analyzing and copying the relevant bits of code from this excellent article.
Alternatively, if you're up to rebuilding SDL entirely, pass --disable-stdio-redirect as a compilation parameter.
Members - Reputation: 612
Posted 23 August 2005 - 10:07 AM
HANDLE newConsoleInput = GetStdHandle(STD_INPUT_HANDLE);
HANDLE newConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
int inFd = _open_osfhandle((long)newConsoleInput, _O_TEXT);
int outFd = _open_osfhandle((long)newConsoleOutput, _O_TEXT);
FILE* consoleIn = _fdopen(inFd, "r");
FILE* consoleOut = _fdopen(outFd, "w");
setvbuf(consoleIn, NULL, _IONBF, 0);
setvbuf(consoleOut, NULL, _IONBF, 0);
*stdin = *consoleIn;
*stdout = *consoleOut;
Here's my console activation function. The only problem is, I still don't get a console [sad]. What I'm probably doing wrong involves HANDLEs probably, since I don't know what a handle is a typedef of. when I use _open_osfhandle(newConsoleInput, _0_TEXT); I get an error: invalid conversion from `void*' to `long int'. I have tried casting it to many things.