Изменение значения стандартного вывода в программе C++

StackOverflow https://stackoverflow.com/questions/376136

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

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

-кр

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top