Как написать в стандартный вывод после использования freopen [duplicate]

0

После freopen -ing stdout, Как я могу напечатать на терминале?

freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
  • 1
    Код легче понять, чем английский - вы должны опубликовать его.
  • 0
    На какой ОС? Я считаю, что Windows не обязательно позволяет этому работать ...
Показать ещё 7 комментариев
Теги:
freopen

2 ответа

6

Я считаю, что это то, что вы ищете:

Как только я использовал freopen, как я могу вернуть исходный stdout (или stdin)?

Там нет портативного решения. Но связь также объясняет возможное решение, используя свой собственный поток и непортабельное решение, которое будет работать на большинстве систем Posix.

Нет хорошего пути. Если вам нужно переключиться назад, лучшим решением является не использование freopen в первую очередь. Попробуйте использовать свою собственную явную выходную (или входную) переменную потока, которую вы можете переназначить по желанию, оставив исходный stdout (или stdin) без изменений. Например, объявите глобальную

FILE *ofp;

и замените все вызовы printf (...) на fprintf (ofp,...). (Очевидно, вам придется проверять и на вызовы putchar и puts). Затем вы можете установить p в stdout или на что-нибудь еще.

Вы могли бы задаться вопросом, можете ли вы полностью пропустить freopen и сделать что-то вроде

FILE *savestdout = stdout;
stdout = fopen(file, "w");    /* WRONG */

оставляя себя в состоянии восстановить stdout позже, делая

stdout = savestdout;      /* WRONG */

но такой код вряд ли будет работать, потому что stdout (и stdin и stderr) обычно являются константами, которые не могут быть переназначены (именно поэтому freopen существует в первую очередь).

Возможно, непереносимо сохранить информацию о потоке перед вызовом freopen, чтобы открыть какой-то файл на своем месте, чтобы исходный поток впоследствии можно было восстановить. Самый простой и надежный способ - манипулировать базовыми файловыми дескрипторами, используя системный вызов, такой как dup или dup2, если он доступен. Другой - копировать или проверять содержимое структуры FILE, но это чрезвычайно непрозрачно и ненадежно.

В некоторых системах вы можете повторно открыть специальный файл устройства (например,/dev/fd/1 в современных версиях Unix), который по-прежнему привязан к (например) исходному стандарту. Вы можете в некоторых системах явно повторно открыть управляющий терминал, но это не обязательно то, что вы хотите, поскольку исходный ввод или вывод (то есть, какой stdin или stdout был до того, как вы вызвали freopen), можно было перенаправить из командная строка.

-3

Вы можете это сделать:

#include <fstream> 

ofstream out("out.txt");

out<<"something";

then

cout<<"something";
  • 5
    Это не отвечая на вопрос
  • 1
    @SHR: пусть человек, который задает этот вопрос, скажет, что он отвечает или нет, может быть, это полезно для него
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню