Sunday, 6 November 2011

How can you restore a redirected standard stream? in C programming

How can you restore a redirected standard stream?
The preceding example showed how you can redirect a standard stream from within your program. But what
if later in your program you wanted to restore the standard stream to its original state? By using the standard
C library functions named dup() and fdopen(), you can restore a standard stream such as stdout to itsoriginal state.

The dup() function duplicates a file handle. You can use the dup() function to save the file handlecorresponding to the stdout standard stream. The fdopen() function opens a stream that has been duplicated with the dup() function. Thus, as shown in the following example, you can redirect standard streams and restore them:

#include <stdio.h>
void main(void);
void main(void)
{
int orig_stdout;
/* Duplicate the stdout file handle and store it in orig_stdout. */
orig_stdout = dup(fileno(stdout));
/* This text appears on-screen. */
printf(“Writing to original stdout...\n”);
/* Reopen stdout and redirect it to the “redir.txt” file. */
freopen(“redir.txt”, “w”, stdout);
/* This text appears in the “redir.txt” file. */
printf(“Writing to redirected stdout...\n”);
/* Close the redirected stdout. */
fclose(stdout);
/* Restore the original stdout and print to the screen again. */
fdopen(orig_stdout, “w”);
printf(“I’m back writing to the original stdout.\n”);
}

Cross Reference:

IV.2: What is a stream?
IV.3: How do you redirect a standard stream?
IV.5: Can stdout be forced to print somewhere other than the screen?

1 comment: