На что указывает указатель файла в C? - PullRequest
0 голосов
/ 14 октября 2018

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

FILE *fptr1 = fopen( "filename", "r")

Я понимаю, что FILEструктура данных в библиотеке stdio.h, которая содержит информацию о файлеЯ также знаю, что функция fopen () возвращает структуру FILE.Но в этом ли цель указателя?Это просто указывает на кучу информации о файле?Я читал об этом, и я слышал, как термин "файловые потоки" плавает вокруг.Я понимаю, что это интерфейс связи с файлом (найди его расплывчатым, но я его возьму).Это то, на что указывает указатель в простых терминах - поток файлов?В приведенном выше примере кода указатель будет указывать на поток входного файла?

Спасибо!

1 Ответ

0 голосов
/ 14 октября 2018

Структура FILE должна быть непрозрачной.Другими словами, вы не должны изучать это, если хотите, чтобы ваши программы оставались переносимыми.

Кроме того, FILE всегда используется через указатель, поэтому вам даже не нужно знать его размер.

В некотором смысле, вы можете считать его void * для всехнамерения и цели.


Теперь, если вас действительно интересует, что может содержать тип FILE , сам стандарт C объясняет это довольно хорошо!См. C11 7.21.1p2:

(...) FILE, который представляет собой тип объекта, способный записывать всю информацию, необходимую для управления потоком, включая указатель положения файла, указатель на егосвязанный буфер (если есть), индикатор ошибки , который записывает, произошла ли ошибка чтения / записи, и индикатор конца файла , который записывает, имеет ли конец файлабыли достигнуты;(...)

Итак, как вы видите, по крайней мере, он содержит такие вещи, как:

  • Позиция внутри файла
  • Указатель набуфер
  • Флаги ошибок
  • Флаг EOF

Упоминает (как вы делаете) потоки .Вы можете найти более подробную информацию об этом в разделе 7.21.2. Потоки:

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

(...)

Бинарный поток является упорядоченнымпоследовательность символов, которая может прозрачно записывать внутренние данные.(...)

Как мы можем прочитать, поток - это упорядоченная последовательность символов.Обратите внимание, что это не говорит, конечна ли эта последовательность или нет!(Подробнее об этом позже)

Итак, как они соотносятся с файлами ?Давайте посмотрим раздел 7.21.3 Файлы:

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

(...)

Смотрите, когда вы открываете«файл на диске» (типичный файл на вашем компьютере), вы связываете «поток» (в данном случае конечный), который вы можете открывать / читать / записывать / закрывать / ... через fread() и связанные функции;и структура данных, в которой хранится вся необходимая информация, - FILE.

Однако существуют и другие виды файлов.Представьте себе генератор псевдослучайных чисел.Вы можете представить его как бесконечный файл только для чтения: каждый раз, когда вы читаете, он дает вам другое значение, и он никогда не «заканчивается».Следовательно, с этим файлом будет связан бесконечный поток.И некоторые операции могут не иметь смысла (например, вы не можете найти его, т.е. переместить индикатор положения файла).


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...