C Interview Questions and Answers


Once I have used freopen, how can I get the original stdout (or stdin) back?

There isn't a good way. If you need to switch back, the best solution is not
to have used freopen in the first place. Try using your own explicit output (or
input) stream variable, which you can reassign at will, while leaving the original
stdout (or stdin) undisturbed. For example, declare a global

FILE *ofp;

and replace all calls to printf( ... ) with fprintf(ofp, ... ). (Obviously, you'll
have to check for calls to putchar and puts, too.) Then you can set ofp to stdout
or to anything else.

You might wonder if you could skip freopen entirely, and do something like

FILE *savestdout = stdout; stdout = fopen(file, "w"); /* WRONG */

leaving yourself able to restore stdout later by doing

stdout = savestdout; /* WRONG */

but code like this is not likely to work, because stdout (and stdin and stderr)
are typically constants which cannot be reassigned (which is why freopen exists
in the first place). It may be possible, in a nonportable way, to save away information
about a stream before calling freopen to open some file in its place, such that
the original stream can later be restored. The most straightforward and reliable
way is to manipulate the underlying file descriptors using a system-specific call
such as dup or dup2, if available Another is to copy or inspect the contents of
the FILE structure, but this is exceedingly nonportable and unreliable.

Posted by:Richards