Что такое ключевое слово FILE в C?

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

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

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

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

4 ответов


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

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

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

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

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

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

определение структуры кажется немного более иллюзорным, чем его описание. Это непосредственно взято из моего 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 обычно имеют некоторую форму комментирования, но их структура для этого похоронена под большим количеством кода.

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


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

typedef struct {
   ...
} FILE;

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

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

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

FILE* fp;

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

FILE *fp;

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


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

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

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

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