Как установить stdin и stdout в состояние по умолчанию?

#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 для этого?