Какая разница между файловым дескриптором и указателем на файл?

Я хочу знать разницу между файловым дескриптором и указателем файла.

Кроме того, в каком сценарии вы бы использовали один вместо другого?

Ответ 1

Дескриптор файла - это "дескриптор" низкого уровня, используемый для идентификации открытого файла (или сокета или чего-то еще) на уровне ядра в Linux и других Unix-подобных системах.

Вы передаете "обнаженные" файловые дескрипторы для фактических вызовов Unix, таких как read(), write() и т.д.

A FILE pointer - это стандартная библиотека на уровне C, используемая для представления файла. FILE обертывает дескриптор файла и добавляет буферизацию и другие функции для облегчения ввода-вывода.

Вы передаете указатели FILE на стандартные функции C, такие как fread() и fwrite().

Ответ 2

Один буферизуется (FILE *), а другой - нет. На практике вы хотите использовать FILE * почти всегда, когда вы читаете "реальный" файл (т.е. На диске), если вы не знаете, что делаете, или если ваш файл на самом деле является сокетом или так..

Вы можете получить дескриптор файла из FILE * с помощью fileno(), и вы можете открыть буферизованный FILE * из дескриптора файла, используя fdopen()

Ответ 3

Дескриптор файла - это просто целое число, которое вы получаете от вызова Posix 'open(). Используя стандартный C fopen(), вы получите структуру FILE назад. Структура FILE содержит этот файловый дескриптор, среди прочего, такие как индикаторы конца файла и ошибки, положение потока и т.д.

Таким образом, использование fopen() дает вам определенную сумму абстракции по сравнению с open(). В общем, вы должны использовать fopen(), поскольку это более переносимо, и вы можете использовать все другие стандартные функции C, которые используют структуру FILE, т.е. fprintf() и семейство.

Нет проблем с производительностью при использовании или.

Ответ 4

Хотите добавить точки, которые могут быть полезны.

О FILE *

  • не может использоваться для межпроцессного взаимодействия (IPC).
  • используйте его, когда вам нужен буферизованный ввод/вывод.
  • Я использую его много раз для журналов отладки. пример,

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);
    

О FILE DESCRIPTOR

  • Он обычно используется для IPC.

  • Дает управление на низком уровне для файлов в системах * nix (устройства, файлы, сокеты и т.д.), следовательно, более мощным, чем FILE *.

Ответ 5

Дескриптор файла vs Указатель файла

Дескриптор файла:

Дескриптор файла - это целочисленное значение, возвращаемое системным вызовом open().

int fd = open (filePath, mode);

  • Обработчик низкого уровня/уровня ядра.
  • passe для чтения() и write() системных вызовов UNIX.
  • Не включает буферизацию и такие функции.
  • Менее портативен и не хватает эффективности.

Указатель файла:

Указатель файлов - это указатель на структуру 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;
  • Это интерфейс высокого уровня.
  • Передано в функции fread() и fwrite().
  • Включает буферизацию, индикацию ошибок и обнаружение EOF и т.д.
  • Обеспечивает более высокую мобильность и эффективность.

Ответ 6

FILE * более полезен при работе с текстовыми файлами и вводом/выводом пользователя, поскольку он позволяет использовать функции API, такие как sprintf(), sscanf(), fgets(), feof() и т.д.

API дескриптора файлов является низкоуровневым, поэтому он позволяет работать с сокетами, трубами, файлами с отображением памяти (и обычными файлами, конечно).

Ответ 7

Просто записка, чтобы закончить обсуждение (если интересно)....

fopen может быть небезопасным, и вы, вероятно, должны использовать fopen_s или open с установленными исключительными битами. C1X предлагает x режимы, поэтому вы можете fopen с режимами "rx", "wx" и т.д.

Если вы используете open, вы можете рассмотреть open(..., O_EXCL | O_RDONLY,... ) или open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

См., например, Не делайте предположений о fopen() и создании файла.

Ответ 8

Системные вызовы в основном используются файловым дескриптором, например read и write. Функция библиотеки будет использовать указатели файлов (printf, scanf). Но функции библиотеки используют только внутренние системные вызовы.

Ответ 9

В Unix и связанных с ним компьютерных операционных системах файловый дескриптор (FD, реже fildes) представляет собой абстрактный индикатор (дескриптор), используемый для доступа к файлу или другому ресурсу ввода/вывода, например, к каналу или сетевому сокету. Файловые дескрипторы являются частью интерфейса прикладного программирования POSIX. Дескриптор файла является неотрицательным целым числом, хотя он обычно представлен на языке программирования C как тип int, отрицательные значения зарезервированы для обозначения "нет значения" или условия ошибки.