Файлы являются упорядоченными последовательностями значений. Операторы WRITE добавляют значения к существующей последовательности (всегда в конец), операторы READ могут получать значения в той же последовательности, в которой они были ранее считаны. Значения не ограничены типом CHAR как в текстовых файлах, но могут быть представлены почти любым типом Паскаля. Буферные переменные и операторы PUT/GET предлагают дополнительные способы управления файлами.
Дополнительно к текстовым файлам, Паскаль позволяет нам определять новые файловые типы с компонентами любого ранее объявленного типа за исключением тех агрегатных типов, в которые входят файлы. Типичное объявление файлового типа:
VAR
IntFile: FILE OF INTEGER;
Значение IntFile является последовательностью значений типа INTEGER – только значения типа INTEGER могут быть считаны из или записаны в такой файл. Файловые переменные – единственный тип переменных Паскаля, которые не могут участвовать в операторах присваивания. Все файловые значения должны быть созданы с использованием преопределенных операций.
Объявление файловой переменной неявно объявляет буферную переменную, записываемую как файловый идентификатор, за которым следует стрелка вверх (например, IntFile^) того же типа, что и компоненты файла. Когда мы читаем файл, IntFIle^ содержит значение доступное для считывания. Новые элементы файла добавляются в файл заполнением буферной переменной и записью ее содержимого. Буферные переменные могут появляться везде, где появляются другие переменные. Например:
3 + IntFile^ * 7
Однако, буферные переменные не являются идентификаторами, поскольку завершаются на символ, который не является символом или цифрой. Таким образом, мы должны исправить наши синтаксические правила, заменив <идентификатор> в правой части правила для <множителя> на <ссылка на переменную>, которая покрывает идентификаторы и буферные переменные.
<множитель> ::= <ссылка на переменную> | <вызов функции>
|<беззнаковая константа> | (<выражение>)
| NOT <множитель> | <выражение множества>
<ссылка на переменную> ::= <идентификатор переменной> | <буферная переменная>
<буферная переменная> ::= <файловая переменная>^
<файловая переменная> ::= <ссылка на переменную>
Хотя синтаксические правила показывают, что идентификатор, за которым следует некоторое количество символов ^ является файловой переменной, фактически только один символ ^ может появляться .
Значения текстовых файлов – 3-списки. Первые два элемента которых строки будущего и прошлого файла. Для произвольных файлов значения прошлого и будущего – это списки элементов типа которым объявлен тип. Третий элемент – индикатор режима, который показывает, открыт ли файл для чтения или записи.
Поскольку объявление файловой переменной вводит буферную переменную семантика операторов объявления для файлов должна быть изменена для того, чтобы учесть буферную переменную.