
16.2.1. Нетекстовые файлы.
Файлы – это последовательности элементов одного типа. Операции над файлами перечислены ниже.
-
Операция
Тип операнда -> Тип результата
REWRITE
FILE -> void
PUT
FILE -> void
RESET
FILE -> void
GET
FILE -> void
EOF
FILE -> BOOLEAN
Термин void (пустой) обозначает, что эти операции не возвращают значение, эти операции похожи на операторы процедур Паскаля и могут появляться везде, где может появляться оператор. Действие этих операций на состояние файла представлено конечным автоматом ниже, который имеет два состояния R и W.
Начальные RESET или REWRITE устанавливают файл в режим R или W.
REWRITE и PUT используются для построения файловых значений. REWRITE очищает файл и готовит его для записи.
REWRITE(F) = {(u,v): F не INPUT или OUTPUT и v = u за исключением того,
что v(F) = <<>, <>, W>}
Если файл открыт для записи, PUT добавляет значение переменной в буфере к файлу и оставляет значение переменной буфера неопределенной.
PUT(F) = {(u,v): u(F).3 = W и v = u, за исключением того, что v(F).1 = u(F).1u(F^)) и v(F^) неопределено}
PUT неопределен, когда файл не открыт для чтения.
Например, для записи файла целых чисел, он должен быть объявлен и инициализирован.
VAR
IntList: FILE OF INTEGER;
BEGIN
REWRITE(IntList);
...
END
Значения присваиваются IntList^ таким образом, чтобы следующий оператор PUT добавит значение в IntList.
{Эквивалентно WRITE(IntList, 1)}
IntList^ := 1;
PUT(IntList); {Добавляет 1 в IntList, IntList^ неопрелен}
{Эквивалентно WRITE(IntList, 2)}
IntList^ := 2;
PUT(IntList); {Добавляет 2 в IntList, IntList^ неопрелен}
В этой точке IntList содержит значения 1 и 2 в списке прошлого, файл открыт для записи и содержимое IntList^ неопределено.
IntList = <<1, 2>, <>, W> и IntList^ неопределено
RESET и GET – операции, которые читают значения из файлов. RESET возвращет указатель файла в стартовую позицию для того, чтобы можно было начать чтение. Значению переменной файлового буфера присваивается значение первого компонента в списке будущего файл, если таковой имеется.
RESET(F) = = {(u,v): F не INPUT или OUTPUT и v = u за исключением того,
что v(F) = <<>, u(F).1 & u(F).2, R> и v(F^) = Θ(u(F).1 & u(F).2)}
Поскольку Θ не определена на пустых списках, значение переменной буфера также не определено, когда RESET применяется к пустому файлу.
Если файл открыт для чтения и его список будущего не пустой, GET переносит первый элемент списка будущего в список прошлого и присваивает значение нового первого элемента списка будущего переменной буфера.
GET(F) = {(u,v): u(F).3 = R и u(F).2 <> и v=u, за исключением того,
что v(F).1 = u(F).1 Θ (u(F.2))), v(F).2 = Λ (u(F.2)), и v(F^) = Θ (Λ (u(F.2)))}
Если файл не открыт для чтения, программа при вызове GET выдает ошибку времени выполнения, также ошибка произойдет, если не осталось данных для считывания (список будущего пуст).