开发者

freopen: reverting back to original stream

开发者 https://www.devze.com 2022-12-10 01:01 出处:网络
I n开发者_开发问答eeded to forward stdout to different files to separate some prints produced and the reverting back to normal stdout.

I n开发者_开发问答eeded 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


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()");
    }


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号