Во-первых, нет особенно веской причины использовать fdopenif 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?