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.