Я хочу знать различие между указателем файла и дескриптором файла.
Кроме того, в каком сценарии Вы использовали бы один вместо другого?
Дескриптор файла - это низкоуровневый целочисленный «дескриптор», используемый для идентификации открытого файла (или сокета, или чего-то еще) на уровне ядра в Linux и других Unix-подобных системах.
Вы передаете «голые» файловые дескрипторы в фактические вызовы Unix, такие как read ()
, write ()
и так далее.
Указатель FILE
- это стандартная конструкция уровня библиотеки C, используемая для представления файла. ФАЙЛ
является оболочкой для дескриптора файла и добавляет буферизацию и другие функции, упрощающие ввод-вывод.
Вы передаете указатели FILE
стандартным функциям C, таким как fread ()
и fwrite ()
.
Системные вызовы в основном используют дескриптор файла, например чтение
и запись
. Библиотечная функция будет использовать указатели файлов ( printf
, scanf
). Но библиотечные функции используют только внутренние системные вызовы.
Дескриптор файла - это просто целое число, которое вы получаете от вызова Posix ' open ()
. Используя стандартную функцию C fopen ()
, вы получаете обратно структуру FILE
. Структура FILE
содержит дескриптор этого файла, среди прочего, например, индикатор конца файла и ошибки, позицию потока и т. Д.
Таким образом, использование fopen ()
дает вам определенную объем абстракции по сравнению с open ()
. В общем, вам следует использовать fopen ()
, поскольку он более переносимый, и вы можете использовать все другие стандартные функции C, которые используют структуру FILE
, то есть fprintf ()
и семья.
При использовании или нет проблем с производительностью.
ФАЙЛ *
более полезен при работе с текстовыми файлами и пользовательским вводом / выводом, поскольку он позволяет использовать такие функции API, как sprintf ()
, sscanf ()
, fgets ()
, feof ()
и т. Д.
API файлового дескриптора является низкоуровневым, поэтому он позволяет работать с сокетами, каналами, отображенными в память файлами (и обычные файлы, конечно).
Один буферизируется ( ФАЙЛ *
), а другой нет. На практике вы хотите использовать FILE *
почти всегда, когда вы читаете из «реального» файла (т.е. на диске), если вы не знаете, что делаете, или если ваш файл на самом деле не является сокетом. или около того ..
Вы можете получить дескриптор файла из FILE *
, используя fileno ()
, и вы можете открыть буферизованный FILE *
из файла дескриптор с использованием fdopen ()