Может использовать freopen()
;он предназначен для этого контекста.
Однако первый вызов dup2()
в этом коде заставляет дескриптор файла, лежащий в основе потока stdin
(дескриптор файла STDIN_FILENO
или 0), обращатьсяк файловому дескриптору, лежащему в основе файлового потока in
.Когда вы читаете из stdin
после этого, оно происходит из FILE1
.
Аналогично, второй вызов dup2()
делает дескриптор файла лежащим в основе потока stdout
(дескриптор файла STDOUT_FILENO
или 1
) обратитесь к файловому дескриптору, лежащему в основе файлового потока out
.Когда после этого вы пишете stdout
, он переходит к FILE2
.
Существует риск путаницы, если код также пытается прочитать из in
или out
после вызовов dup2()
.Этого можно избежать с помощью freopen()
.Вы также не закрываете in
или out
перед выходом, даже если открыли их.Как правило, это хорошая идея, чтобы явно закрыть то, что вы открыли.Код, выполняемый exit()
- который вызывается, когда main()
возвращает - закрывает все потоки открытых файлов.В принципе, вы можете закрыть in
и out
сразу после dup2()
звонков - они больше не нужны.
Другой, лучшей альтернативой будет использование getc(in)
и putc(c, out)
(хорошая работа по использованию int c;
) - за исключением того, что, как представляется, это запрещено правилами вопроса, что явно является программированием.