Что такое ключевое слово 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/
но если вам интересно, вот как это выглядит: