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