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

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

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

  FILE * fp; // 

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

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


9

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

  typedef  struct {...} FILE;  

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

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

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

  FILE * fp;  

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

  FILE * fp;  

Улучшите этот ответ
отредактировано 25 апреля 2018 в 13:09
15 апр. ’11 в 05:43
  • 1
    Это имеет больше смысла, я не знал, что непрозрачные типы до этого были у всех. Спасибо! — johnholtsdater 15 апр. ’11 в 18:12
  • Я не вижу аргумента в пользу размещения звездочки с идентификатором переменной. — IllidanS4 поддерживает Монику 25 апреля 2018 г., в 9:37
  • @ IllidanS4. Рассмотрим FILE * fp1, fp2; Он выглядит так, как если бы fp1 и fp2 были одного типа, но не . Это обманчивое заявление. — Йенс 25 апр. ’18 в 12:06
  • Да, это допустимый аргумент, но это не подразумевается в исходном примере. — IllidanS4 поддерживает Монику 26 апр 2018, в 14:08
добавить комментарий |

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

  typedef struct {...} FILE;  

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

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

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

  FILE * fp;  

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

  FILE * fp;  

3

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

Улучшите этот ответ
ответил 15 апр. 2011 в 17:35
добавить комментарий |

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


0

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

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

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

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

Улучшите этот ответ
ответил 15 апр. ’11 в 17:35
  • Спасибо за эти ссылки, я хотел бы добавить еще один. — johnholtsdater, 15 апр. 2011 г., в 18:11
  • 1
    По прошествии более 19 лет и получения ответов на более двух миллионов вопросов AllExperts.com теперь закрыт. Приносим извинения за неудобства. . Вот снимок того, как это, вероятно, выглядело, когда был написан ответ. — GnP 20 окт. ’18 в 0:15
добавить комментарий |

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

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

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

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



Структура чтения/записи в файл на C — GeeksforGeeks

Структура чтения/записи в файл на C
GeeksforGeeks

->

Предварительное условие: структура в C

Для записи в файл легко записать строку или int в файл с помощью fprintf и putc , но вы могли столкнуться с трудностями при написании содержимого struct. fwrite и fread make task проще, когда вы хотите записывать и читать блоки данных.

  1. fwrite: Ниже приводится объявление функции fwrite
      size_t fwrite (const void * ptr, size_t size, size_t nmemb, FILE * stream)   ptr  - это указатель на массив элементов для записи  size  - это размер в байтах каждого записываемого элемента  nmemb  - это количество элементов, каждый из которых имеет размер size в байтах  поток  - это указатель на объект FILE, определяющий вывод  поток 
    filter_none

    редактировать
    close

    play_arrow

    ссылка
    яркость_4
    код

    //Программа на C для записи
    //структура в файл
    #include
    #include
    #include
    //структура для чтения и записи
    struct человек
    {
    int id;
    char fname [20];
    char lname [20];
    };
    int main ()
    {
    ФАЙЛ * Outfile;
    //открыть файл для запись
    outfile = fopen ( "человек. dat " , " w " );
    if (outfile == NULL)
    {
    fprintf (stderr, " nОшибка открытия файла n" );
    выход (1);
    }
    struct человек input1 = {1, "rohan" , "sharma" };
    struct person input2 = {2, "махендра" , "дхони" };
    //записываем структуру в файл
    fwrite (& input1, sizeof ( struct person), 1, outfile);
    fwrite (& input2, sizeof ( struct person), 1, outfile);
    если ( fwrite ! = 0)
    printf ( «содержимое файла успешно записано! n» );
    else
    printf ( «ошибка записи файла! n» );
    //закрываем файл
    fclose (Outfile);
    return 0;
    }
    chevron_right
     

    filter_none
    
    

    Вывод:

     gcc  demowrite.c./a.outcontents в файл успешно записан! 
  2. fread: Ниже приводится объявление функции fread
      size_t fread (void * ptr, size_t size, size_t nmemb, FILE * stream)   ptr  - это указатель на блок памяти с минимальным размером  size * nmemb байтов.  size  - это размер в байтах каждого элемента, который нужно прочитать.  nmemb  - это количество элементов, каждый с  размер в байтах.  stream  - это указатель на объект FILE, который определяет входной поток. 
    filter_none

    редактировать
    close

    play_arrow

    ссылка
    яркость_4
    код

    //Программа на C для чтения
    //структура из файла
    #include
    #include
    //структура человека с 3 поля
    struct person
    {
    int id;
    char fname [20];
    char lname [20];
    };
    //Программа драйвера
    int main ()
    {
    ФАЙЛ * infile;
    struct ввод человека;
    //Открытый человек. dat для чтения
    infile = fopen ( "person.dat" , "r" );
    if (infile == NULL)
    {
    fprintf (stderr, " nОшибка открытия файла n" );
    exit (1);
    }
    //считываем содержимое файла до конца файла
    while ( fread (& input, sizeof ( struct person), 1, infile))
    printf ( "id =% d name =% s% s n" , input.id,
    input.fname, input.lname);
    //закрываем файл
    fclose (infile);
    return 0;
    }
    chevron_right
     

    filter_none
    
    

    Вывод:

     gcc  demoread.c./a. outid = 1 name = rohan sharmaid = 2 name = mahendra dhoni 

Автор статьи — Мандип Сингх . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на deposit@geeksforgeeks.org. Смотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогайте другим гикам.

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

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе.

Мои личные заметки arrow_drop_up
Оцените статью
logicle.ru
Добавить комментарий