freopen: возврат к исходному потоку

мне нужно было переслать stdout в разные файлы, чтобы отделить некоторые отпечатки и вернуться к нормальному stdout.

Я freopen чтобы переключиться на файл таким образом:

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);

и это действительно работает, но в конце процесса (имейте в виду, что stdout перенаправляется много раз таким же образом) я не могу вернуть его к исходному stdout. Я попробовал следующее:

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

но это, кажется, не работает.. просто для информации Я развиваюсь на macosx.

Что делать?

спасибо заранее

2 ответов


Это может быть достигнуто с помощью вызовов fileno, dup и dup2. Я пробовал это на linux не уверен, будет ли это работать на mac, но я уверен, что вы получите некоторые эквивалентные функции для вашей установки. Посмотрите, работает ли этот пример кода для вас. Извините за отсутствие обработки ошибок в коде. :)

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

Это кажется окольным путем решения вашей проблемы. Почему бы просто не открыть каждый файл с fopen() а потом пишу своему FILE * С fputs, fprintf, fwrite etc? Нет необходимости перенаправлять stdout.