read () & write () использовать небуферизованный ввод / вывод. ( fd : дескриптор целочисленного файла)
fread () & fwrite () использовать буферизованный ввод / вывод. ( FILE * структурный указатель)
Двоичные данные, записанные в канал с помощью write () могут не быть в состоянии читать двоичные данные с помощью fread () , из-за выравнивания байтов, переменных размеров и т. д. Это дерьмо стрелять.
В большинстве кодов драйверов устройств низкого уровня используются небуферизованные вызовы ввода-вывода.
Большинство операций ввода-вывода прикладного уровня использует буферизацию.
Использование FILE * и связанных с ним функций
все в порядке на каждой машине: но переносимость теряется
на других архитектурах в чтении и записи двоичных данных.
fwrite () буферизует ввод-вывод и может привести к ненадежным результатам, если
написано для 64-битной архитектуры и работает на 32-битной; или (Windows / Linux).
Большинство ОС имеют макросы совместимости в своем собственном коде, чтобы предотвратить это.
Для переносимости низкоуровневого двоичного ввода / вывода read () и write () гарантированно
один и тот же двоичный файл читает и пишет при компиляции на разных архитектурах.
Основная вещь состоит в том, чтобы выбрать один путь или другой и быть последовательным об этом,
по всему бинарному набору.
<stdio.h> // mostly FILE* some fd input/output parameters for compatibility
// gives you a lot of helper functions -->
List of Functions
Function Description
───────────────────────────────────────────────────────────────────
clearerr check and reset stream status
fclose close a stream
fdopen stream open functions //( fd argument, returns FILE*) feof check and reset stream status
ferror check and reset stream status
fflush flush a stream
fgetc get next character or word from input stream
fgetpos reposition a stream
fgets get a line from a stream
fileno get file descriptor // (FILE* argument, returns fd)
fopen stream open functions
fprintf formatted output conversion
fpurge flush a stream
fputc output a character or word to a stream
fputs output a line to a stream
fread binary stream input/output
freopen stream open functions
fscanf input format conversion
fseek reposition a stream
fsetpos reposition a stream
ftell reposition a stream
fwrite binary stream input/output
getc get next character or word from input stream
getchar get next character or word from input stream
gets get a line from a stream
getw get next character or word from input stream
mktemp make temporary filename (unique)
perror system error messages
printf formatted output conversion
putc output a character or word to a stream
putchar output a character or word to a stream
puts output a line to a stream
putw output a character or word to a stream
remove remove directory entry
rewind reposition a stream
scanf input format conversion
setbuf stream buffering operations
setbuffer stream buffering operations
setlinebuf stream buffering operations
setvbuf stream buffering operations
sprintf formatted output conversion
sscanf input format conversion
strerror system error messages
sys_errlist system error messages
sys_nerr system error messages
tempnam temporary file routines
tmpfile temporary file routines
tmpnam temporary file routines
ungetc un-get character from input stream
vfprintf formatted output conversion
vfscanf input format conversion
vprintf formatted output conversion
vscanf input format conversion
vsprintf formatted output conversion
vsscanf input format conversion
Так что для базового использования я бы лично использовал вышеупомянутое, не смешивая идиомы слишком сильно.
Для сравнения
<unistd.h> write()
lseek()
close()
pipe()
<sys/types.h>
<sys/stat.h>
<fcntl.h> open()
creat()
fcntl()
all use file descriptors.
Они обеспечивают детальный контроль над чтением и записью байтов.
(рекомендуется для специальных устройств и fifos (труб)).
Опять же, используйте то, что вам нужно, но сохраняйте согласованность в своих идиомах и интерфейсах.
Если большая часть вашей кодовой базы использует один режим, используйте его тоже, если нет
настоящая причина не Оба набора функций библиотеки ввода / вывода чрезвычайно надежны
и использовал миллионы раз в день.
note - Если вы взаимодействуете с C I / O с другим языком,
(perl, python, java, c #, lua ...) посмотрите что разработчики этих языков
рекомендую, прежде чем писать код на C и избавить себя от неприятностей.