Изменение значения стандартного вывода в программе на C ++ - PullRequest
3 голосов
/ 18 декабря 2008

У меня есть программа для Windows C ++, которая делает что-то вроде:

  FILE* pf = ...;
  *stdout = *pf;    // stdout is defined in stdio.h

Я ищу объяснение того, что происходит, когда вы меняете значение дескриптора файла stdout. Это просто способ перенаправить стандартный вывод?

-cr

Ответы [ 2 ]

6 голосов
/ 18 декабря 2008

Да, когда вы меняете стандартный вывод, вы фактически перенаправляете его в другое место. Тем не менее, вы должны , а не напрямую назначать на стандартный вывод. Если вы хотите перенаправить стандартный вывод, вы должны вместо этого использовать freopen().

Вы никогда не должны напрямую манипулировать объектами FILE - вы должны обращаться с ними как с непрозрачными типами и взаимодействовать с ними только через функции из библиотеки <stdio>. Джонатан перечисляет несколько веских причин, почему.

Из стандарта C99, раздел 7.19.3, пункт 6:

Адрес объекта FILE, используемого для управления потоком, может быть значительным; копия Объект FILE не обязательно должен использоваться вместо оригинала.

4 голосов
/ 18 декабря 2008

Если вы измените stdout по назначению, а не с помощью инструмента, обозначенного (в C, freopen(), как сказал Адам Розенфилд, - и, соответственно, в C ++), тогда вы оставите себя открытым для всех видов обязательств.

  • Не ясно, что cout также будет перенаправлено.
  • Скорее всего, у вас будет утечка файлового дескриптора (что может не иметь значения).
  • Возможно, вы не удалили исходный стандартный поток должным образом - потеря информации.
  • Возможно, утечка памяти связана с указателем исходного файла (что опять-таки может не иметь значения).
  • Если что-то закрывается pf, то вы несете ответственность за двойные ошибки (сбои).

Гораздо лучше выполнять работу чисто.

(Демонстрационный код не обязательно написан или даже проверен наиболее опытными людьми из команды разработчиков кода. Если он выглядит сомнительным, это может быть вызвано тем, что он сомнительный.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...