tags:

views:

371

answers:

2

Hello, I needed to forward stdout to different files to separate some prints produced and the reverting back to normal stdout.

I used freopen to switch to the file in this way:

char name[80];
memset(name, 0, 80);
strcpy(name, "./scripts/asm/");
strcat(name, m_func->m_name->m_value);
strcat(name, ".shasm");
freopen(name, "w", stdout);

And it actually works, but at the end of the process (mind that stdout is redirected many times in the previous same way) I'm not able to revert it to original stdout. I tried the following:

freopen("/dev/stdout", "w", stdout);

but it doesn't seem to work.. just for information I'm developing on macosx.

What should I do?

Thanks in advance

A: 

This seems like a roundabout way of solving your problem. Why not just open each file with fopen() and then writing to its FILE * with fputs, fprintf, fwrite etc? No need to redirect stdout.

Nick Meyer
Probably because a (lot of) code is writing without specifying an output stream, e.g. using just plain printf() calls. Redirecting stdout is then a way of "wrapping" that code and making it write to the desired place, without changing it. Just guessing, of course.
unwind
@unwind your guess is correct, this is the most likely usecase of freopen.
vinit dhatrak
I can actually confirm that this is the reason. It is a compiler and I always used printf to print asm code (eg. MOV $1, 4.5f) while creating it and now I don't want to waste time replacing things..
Jack
+3  A: 

This can be achieved using fileno, dup and dup2 calls. I have tried this on linux not sure whether this will work on mac but I am sure you will get some equivalent functions for your setup. See if this sample code works for you. Sorry for lack of error-handling in the code. :)

    #include <stdio.h>

    main()
    {
        int    fd;
        fpos_t pos;

        printf("stdout, ");

        fflush(stdout);
        fgetpos(stdout, &pos);
        fd = dup(fileno(stdout));
        freopen("stdout.out", "w", stdout);

        f();

        fflush(stdout);
        dup2(fd, fileno(stdout));
        close(fd);
        clearerr(stdout);
        fsetpos(stdout, &pos);        /* for C9X */

        printf("stdout again\n");
    }

    f()
    {
    printf("stdout in f()");
    }
vinit dhatrak
Works on OS X as well.
laalto
@laalto Gr8, thanks for the input.
vinit dhatrak