Что именно является ключевым словом FILE в C? - PullRequest
22 голосов
/ 15 апреля 2011

Я начал изучать немного языка C как хобби и довольно долго слепо использовал FILE как объявление для файловых указателей, и мне было интересно. Является ли это ключевым словом или специальным типом данных для C для обработки файлов? Содержит ли он поток в файл внутри и другие данные? Почему он определен как указатель?

Пример, показывающий, что я имею в виду, чтобы сделать его немного более понятным:

FILE* fp; //<-- this
fp = fopen("datum.txt", "r");

while(!feof(fp)) {
   // etc.
}

Ответы [ 4 ]

33 голосов
/ 15 апреля 2011

это ключевое слово или специальный тип данных для C для обработки файлов?

То, к чему вы обращаетесь, это структура typedef, используемая стандартной библиотекой io для хранения соответствующих данных для использования fopen и ее семейства функций.

Почему он определен как указатель?

Используя указатель на структуру, вы можете передать ее в качестве параметра функции. Это, например, то, что примет fgets или fgetc, в виде function(FILE* fp)

Функция fopen будет возвращать указатель на вновь созданную структуру FILE, назначение этого нового указателя неиспользуемой заставит их указывать на одну и ту же вещь.

Содержит ли он поток внутри файла и другие данные?

Определение структуры кажется немного более призрачным, чем ее описание. Это прямо взято из моего stdio.h, из MinGW32 5.1.4

typedef struct _iobuf
{
    char*   _ptr;
    int _cnt;
    char*   _base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char*   _tmpfname;
} FILE;

Что включает в себя прекрасный комментарий перед ним:

Некоторые считают, что никто в здравом уме не должен использовать внутренности этой структуры.

Содержимое этой структуры, по-видимому, сильно меняется в других реализациях, источники glibc обычно имеют некоторую форму комментариев, но их структура для этого скрыта под большим количеством кода.

Имеет смысл прислушаться к вышеупомянутому предупреждению и просто не беспокоиться о том, что оно делает. :)

8 голосов
/ 15 апреля 2011

FILE - это идентификатор, используемый в качестве имени определения типа, обычно для struct.В библиотеке stdio обычно есть что-то вроде

typedef struct {
   ...
} FILE;

.Все функции stdio, работающие с указателями FILE, знают содержание ... и могут обращаться к членам структуры.Программисты C должны использовать такие функции, как fopen, feof, ferror, ungetc и т. Д., Для создания и работы со структурами FILE.Такие типы называются непрозрачными (то есть вы не можете заглянуть внутрь них, но должны использовать функции доступа).

Почему это определяется как указатель?

Это не так.Это структура, на которую ваш код объявляет указатель.Обратите внимание на звездочку в вашем

FILE* fp;

, которая является еще одним примером того, почему звездочка должна идти с идентификатором переменной, а не с именем типа:

FILE *fp;
2 голосов
/ 15 апреля 2011

Это не ключевое слово, это тип данных, определенный в стандарте ANSI C для работы с файлами.Обычно он указывает на внутреннюю структуру, которая описывает файл и его текущее состояние для функций библиотеки.

0 голосов
/ 15 апреля 2011

Это специальный тип данных. Он содержит дескриптор файла, а также различные флаги, используемые внутренне различными вызовами stdio. Вам никогда не нужно будет знать, что именно в нем, просто вы можете передавать этот тип данных.

http://www.cplusplus.com/reference/clibrary/cstdio/FILE/

Однако, если вам интересно, вот как это выглядит:

http://en.allexperts.com/q/C-1587/2008/5/FILE-Structure.htm

...