переключаться между записью в файл и стандартным выводом - PullRequest
0 голосов
/ 29 августа 2011

Я хочу переключиться между записью в файл и stdout Я не могу использовать fprintf, но только printf и freopen как то так:

for(size_t i;i<100;++i)
{
     if(i%2)
     {
        freopen("tmp","w",stdout);
        printf("%d\n",i);
     }
     else
     {
        //return to write to stdout?
        printf("%d\n",i);
     }
}

Как я могу вернуться к записи в stdout?

Обновление

Я пишу кроссплатформенное приложение, и dup не может быть использовано.

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

Никогда не используйте freopen.Он не может достичь того, чего вы хотите, и это очень опасная функция.В случае сбоя единственная безопасная вещь, которую вы можете сделать, - это немедленно прекратить работу программы или убедиться, что к stdout никогда больше не будет обращаться.dup2.Это выглядит примерно так:

fflush(stdout);
int old_stdout = dup(1);
int new_stdout = open("whatever", O_WRDONLY|O_CREAT, 0666);
dup2(new_stdout, 1);
close(new_stdout);
/* use new stdout here */
fflush(stdout);
dup2(old_stdout, 1);
close(old_stdout);
0 голосов
/ 29 августа 2011

Вам необходимо dup дескрипторы файлов и снова открыть их для открытого дескриптора. Почему вы не можете использовать fprintf? (Это домашняя работа?)

...