FILE* для буфферизированного доступа. Дёргать write(2) на каждые несколько записанных байт крайне медленно. Ну и write(2) когда нужно произвести одну операцию записи на дескриптор
Первые, чтобы эта libc’шная кривожопая буферизация не мешалась под ногами, и чтобы не пользоваться API придуманным идиотами, например вспоминать какой режим для fopen что значит, и достаточно ли вызвать fflush перед закрытием записываемого файла.
зависит от задачи. выше уже написали про буферизацию. а иногда и mmap нужно применять, для большей эффективности. если же просто в небольшой файл писать, то достаточно fopen/fwrite/fseek и же с ними. это часть стандарта С. прочие реализации могут зависеть от платформы.
я обычно FILE. А в целом без разницы, потому что они во-первых конвертируются друг в друга, во-вторых, по-хорошему конечно лучше использовать mmap, если возможно. А еще лучше - dio через какой-нибудь io_uring, а еще лучше - купить специальное железо с поддержкой ZNS :))
Из этих двух - сисколлы с fd. Для некоторых частных случаев (печать логов и других append-only потоков данных в файл, или построчное чтение файла) - свои обёртки.
Дёргать write(2) на каждые несколько записанных байт крайне медленно.
write() гарантирует что данные попадут в page cache ярда. А попадут ли данные физически на диск – зависит от ядра и файловой системы. Даже вызов fsync() / fdatasync() не гарантируют, что данные физически окажутся на диске. К примеру, на ZFS данные попадут в ZIL. Фактически сброс на диск произойдёт позже, в рамках транзакционного commit’а.
Да, использование сисколов не гарантирует что буфферизации не будет и данные попадут на диск. Но зато гарантирует, переключение в ядро с соответствующим оверхедом. На мелких порциях данных это может понизить производительность в десятки раз и оверхед от аллокации буффера для stdio на фоне этого окажется незначительным. Ну и не стоит забывать, что stdio - стандартный для си, а вот open/read/write - только в рамках posix и на не-posix системах могут отсутствовать или вести себя иначе (в windows это скорее совместимость с dos, а не posix)
..Это было так же прекрасно, как "Радио Ватикан" которое я услышал на эти вот пластиковые 'тараканчики', которые отец выпаял из старого китайского приемника, мой первый собранный радиоприемник!
Снег, сибирский мороз и льющиеся рождественские хораллы, через треск помех..