#c #stdout #stdin
Вопрос:
Я перенаправил stdin на file1.txt и немедленно file2.txt мимо freopen()
.
freopen("file1.txt","r",stdin);
freopen("file2.txt","w",stdout);
Я выполнил некоторые операции, и теперь я хочу получать ввод от пользователя stdin
и печатать вывод stdout
только через ( не через файлы ).
Как я могу это сделать?
Комментарии:
1. Этот вопрос почти наверняка задавался раньше. Кто — то должен искать дубликат.
Ответ №1:
Перед вызовом вам freopen
необходимо скопировать stdout
stdin
файловые дескрипторы /с помощью dup
и восстановить их , когда вы закончите с помощью dup2
.
Например, для stdout
:
#include <unistd.h>
...
int fd = dup(STDOUT_FILENO);
freopen("file1.txt", "w", stdout);
printf("Writing to file1n");
fflush(stdout);
close(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
printf("Writing to consolen");
Комментарии:
1. Универсальная версия для дублирования любого открытого файла-это
int fd = dup(fileno(fh))
.2. Я знаю, что компиляторы Microsoft реализуют функции POSIX, но портативны ли
STDOUT_FILENO
они ? Можетfileno(stdout)
быть, чтобы избежать магической константы?3.
STDOUT_FILENO
является константой, определенной POSIX, которая достаточно переносима (действительно, MSVC включен). Я думаю, что в системах, отличных от POSIX (например, во встроенных системах), подобный кодfileno(stdout)
в любом случае не будет работать (переносимо).4. Обратите внимание, что
dup(), open(), close(), dup2(),
они не являются частью стандартной библиотеки C.5. @chux-RestorateMonica, каков был бы стандартный способ C для этого?