Я хочу знать разницу между файловым дескриптором и указателем файла.
Кроме того, в каком сценарии вы бы использовали один вместо другого?
Я хочу знать разницу между файловым дескриптором и указателем файла.
Кроме того, в каком сценарии вы бы использовали один вместо другого?
Дескриптор файла - это "дескриптор" низкого уровня, используемый для идентификации открытого файла (или сокета или чего-то еще) на уровне ядра в Linux и других Unix-подобных системах.
Вы передаете "обнаженные" файловые дескрипторы для фактических вызовов Unix, таких как read()
, write()
и т.д.
A FILE
pointer - это стандартная библиотека на уровне C, используемая для представления файла. FILE
обертывает дескриптор файла и добавляет буферизацию и другие функции для облегчения ввода-вывода.
Вы передаете указатели FILE
на стандартные функции C, такие как fread()
и fwrite()
.
Один буферизуется (FILE *
), а другой - нет. На практике вы хотите использовать FILE *
почти всегда, когда вы читаете "реальный" файл (т.е. На диске), если вы не знаете, что делаете, или если ваш файл на самом деле является сокетом или так..
Вы можете получить дескриптор файла из FILE *
с помощью fileno()
, и вы можете открыть буферизованный FILE *
из дескриптора файла, используя fdopen()
Дескриптор файла - это просто целое число, которое вы получаете от вызова Posix 'open()
. Используя стандартный C fopen()
, вы получите структуру FILE
назад. Структура FILE
содержит этот файловый дескриптор, среди прочего, такие как индикаторы конца файла и ошибки, положение потока и т.д.
Таким образом, использование fopen()
дает вам определенную сумму абстракции по сравнению с open()
. В общем, вы должны использовать fopen()
, поскольку это более переносимо, и вы можете использовать все другие стандартные функции C, которые используют структуру FILE
, т.е. fprintf()
и семейство.
Нет проблем с производительностью при использовании или.
Хотите добавить точки, которые могут быть полезны.
О FILE *
Я использую его много раз для журналов отладки. пример,
FILE *fp;
fp = fopen("debug.txt","a");
fprintf(fp,"I have reached till this point");
fclose(fp);
О FILE DESCRIPTOR
Он обычно используется для IPC.
Дает управление на низком уровне для файлов в системах * nix (устройства, файлы, сокеты и т.д.), следовательно, более мощным, чем FILE *
.
Дескриптор файла vs Указатель файла
Дескриптор файла:
Дескриптор файла - это целочисленное значение, возвращаемое системным вызовом open()
.
int fd = open (filePath, mode);
Указатель файла:
Указатель файлов - это указатель на структуру C, возвращаемый библиотечной функцией fopen()
, которая используется для идентификации файла, обертывания дескриптора файла, функции буферизации и всех других функций, необходимых для операции ввода-вывода. Указатель файла имеет тип FILE, определение которого можно найти в "/usr/include/stdio.h" . Это определение может отличаться от одного компилятора к другому.
FILE *fp = fopen (filePath, mode);
// A FILE Structure returned by fopen
typedef struct
{
unsigned char *_ptr;
int _cnt;
unsigned char *_base;
unsigned char *_bufendp;
short _flag;
short _file;
int __stdioid;
char *__newbase;
#ifdef _THREAD_SAFE
void *_lock;
#else
long _unused[1];
#endif
#ifdef __64BIT__
long _unused1[4];
#endif /* __64BIT__ */
} FILE;
FILE *
более полезен при работе с текстовыми файлами и вводом/выводом пользователя, поскольку он позволяет использовать функции API, такие как sprintf()
, sscanf()
, fgets()
, feof()
и т.д.
API дескриптора файлов является низкоуровневым, поэтому он позволяет работать с сокетами, трубами, файлами с отображением памяти (и обычными файлами, конечно).
Просто записка, чтобы закончить обсуждение (если интересно)....
fopen
может быть небезопасным, и вы, вероятно, должны использовать fopen_s
или open
с установленными исключительными битами. C1X предлагает x
режимы, поэтому вы можете fopen
с режимами "rx"
, "wx"
и т.д.
Если вы используете open
, вы можете рассмотреть open(..., O_EXCL | O_RDONLY,... )
или open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
См., например, Не делайте предположений о fopen() и создании файла.
Системные вызовы в основном используются файловым дескриптором, например read
и write
. Функция библиотеки будет использовать указатели файлов (printf
, scanf
). Но функции библиотеки используют только внутренние системные вызовы.
В Unix и связанных с ним компьютерных операционных системах файловый дескриптор (FD, реже fildes) представляет собой абстрактный индикатор (дескриптор), используемый для доступа к файлу или другому ресурсу ввода/вывода, например, к каналу или сетевому сокету. Файловые дескрипторы являются частью интерфейса прикладного программирования POSIX. Дескриптор файла является неотрицательным целым числом, хотя он обычно представлен на языке программирования C как тип int, отрицательные значения зарезервированы для обозначения "нет значения" или условия ошибки.