Согласно 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
не является потокобезопасным по той же причине;в случае сбоя доступ к файлу из любого другого потока приводит к неопределенному поведению.