Во-первых, нет особенно веской причины использовать fdopen
if fopen
как вариант, так и open
другой возможный выбор. Вы не должны open
были открывать файл, если хотите FILE *
. Поэтому включение fdopen
в этот список неверно и запутанно, потому что оно не очень похоже на другие. Теперь я перейду к его игнорированию, потому что здесь важно различать стандарт C FILE *
и дескриптор файла, специфичный для ОС.
Есть четыре основные причины для использования fopen
вместо open
.
fopen
обеспечивает буферизацию ввода-вывода, которая может оказаться намного быстрее, чем то, что вы делаете open
.
fopen
выполняет перевод строки, если файл не открывается в двоичном режиме, что может быть очень полезно, если ваша программа портирована в не-Unix-среду (хотя кажется, что мир сходится только на LF (кроме текстовой сети IETF) протоколы типа SMTP и HTTP и такие)).
- А
FILE *
дает вам возможность использовать fscanf
и другие функции stdio.
- Возможно, когда-нибудь ваш код придется перенести на другую платформу, которая поддерживает только ANSI C и не поддерживает эту
open
функцию.
На мой взгляд, перевод конца строки чаще встречается у вас на пути, чем помогает, а синтаксический анализ fscanf
настолько слаб, что вы неизбежно в конечном итоге выбрасываете его в пользу чего-то более полезного.
И большинство платформ, поддерживающих C, имеют open
функцию.
Это оставляет вопрос буферизации. В местах, где вы в основном читаете или пишете файл последовательно, поддержка буферизации действительно полезна и значительно повышает скорость. Но это может привести к некоторым интересным проблемам, при которых данные не попадают в файл, когда вы ожидаете, что они там будут. Вы должны помнить fclose
или fflush
в соответствующее время.
Если вы выполняете поиск (иначе, fsetpos
или fseek
второй, который немного сложнее использовать в соответствии со стандартами), полезность буферизации быстро снижается.
Конечно, мой уклон заключается в том, что я склонен много работать с сокетами, и есть тот факт, что вы действительно хотите делать неблокирующий ввод-вывод (который FILE *
полностью не поддерживается каким-либо разумным способом) без какой-либо буферизации и часто сложные требования синтаксического анализа действительно окрашивают мое восприятие.
fdopen
иopen
или илиfopen
иopen
?