Что именно является ключевым словом FILE в C?
Я начал изучать C как хобби и довольно долго слепо использовал FILE как объявление для файловых указателей, и мне было интересно. Является ли это ключевым словом или специальным типом данных для C для обработки файлов? Содержит ли он поток в файл внутри и другие данные? Почему он определяется как указатель?
Пример, чтобы показать, что я имею в виду, чтобы сделать это немного более понятным:
FILE* fp; //<-- this
fp = fopen("datum.txt", "r");
while(!feof(fp)) {
// etc.
}
4 ответа
Это ключевое слово или особый тип данных для 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 обычно имеют некоторую форму комментариев, но их структура для этого скрыта под большим количеством кода.
Имеет смысл прислушаться к вышеупомянутому предупреждению и просто не беспокоиться о том, что оно делает.:)
FILE
является идентификатором, используемым в качестве имени определения типа, обычно для struct
, Библиотека stdio обычно имеет что-то вроде
typedef struct {
...
} FILE;
где-то. Все функции stdio, работающие с указателями FILE, знают содержание ...
и может получить доступ к членам структуры. Программисты C должны использовать такие функции, как fopen
, feof
, ferror
, ungetc
и т. д. для создания и использования структур FILE. Такие типы называются непрозрачными (т.е. вы не можете заглянуть внутрь них, но должны использовать функции доступа).
Почему он определяется как указатель?
Это не так. Это структура, на которую ваш код объявляет указатель. Обратите внимание на звездочку в вашем
FILE* fp;
что является еще одним примером того, почему звездочка должна идти с идентификатором переменной, а не именем типа:
FILE *fp;
Это не ключевое слово, это тип данных, определенный в стандарте ANSI C для работы с файлами. Обычно это указывает на внутреннюю структуру, которая описывает файл и его текущее состояние для функций библиотеки.
Это особый тип данных. Он содержит дескриптор файла, а также различные флаги, используемые внутренне различными вызовами stdio. Вам никогда не нужно будет знать, что именно в нем, просто это тип данных, который вы можете передавать.
http://www.cplusplus.com/reference/clibrary/cstdio/FILE/
Однако, если вам интересно, вот как это выглядит: