В чем разница между fopen и freopen? - PullRequest
3 голосов
/ 13 ноября 2010

Freopen не избыточен?

Ответы [ 2 ]

5 голосов
/ 13 ноября 2010

Согласно POSIX (см. Раздел об использовании приложения), freopen изначально был добавлен в C, чтобы облегчить перевод stdin и stdout в двоичный режим.Я подозреваю, что если вы покопаетесь в документах с обоснованием ANSI / ISO, вы сможете найти поддержку этому утверждению.Как и документы POSIX, такое использование не имеет смысла в системах POSIX (где текстовый и двоичный режимы должны вести себя одинаково) и фактически вредно из-за ошибки в спецификации, которая приводит к усечению файла, если строго следовать.

Что касаетсяпрактическое использование, вот некоторые из них, о которых я могу подумать:

  • замена stdin, stdout и stderr перед выполнением внешних программ - но мне не ясно, требуется ли POSIX freopenиспользовать тот же номер дескриптора файла, который был у оригинального FILE или нет, так что я не уверен, что это сработает.Я всегда просто использую open и dup2 для этой цели.
  • библиотека журналов, которая берет FILE * от вызывающей стороны, может использовать freopen, чтобы перевести ее в режим добавления, чтобы гарантировать запись всех данныхв конце, даже если другая программа пишет в файл журнала.
  • , если вы уже передали и сохранили FILE * указатели на ряд компонентов в вашей программе, и вам позже понадобится поддержка заменыфайл (например, на ум приходит ротация журналов), freopen намного проще, чем выслеживать везде, где хранился FILE *, и взламывать код для обновления каждого экземпляра или включать FILE * в вашу собственную структуру, что позволяетвы меняете его.

Полезность всего этого ограничена плохим поведением или freopen при сбое;FILE * становится недействительным и не подлежит восстановлению, поэтому, если какая-либо часть программы все еще использует его, вам нужно найти способ предотвратить дальнейший доступ или немедленно exit.Точно так же freopen не является потокобезопасным по той же причине;в случае сбоя доступ к файлу из любого другого потока приводит к неопределенному поведению.

4 голосов
/ 13 ноября 2010

Нет - freopen() не является избыточным. Например, он позволяет открыть файл в качестве стандартного ввода, в противном случае вы не могли бы рассчитывать на достижение.

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

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