|
|||||||||||||||||
Нетекстовые файлы. ⇐ ПредыдущаяСтр 4 из 4 16.2.1. Нетекстовые файлы.
Файлы – это последовательности элементов одного типа. Операции над файлами перечислены ниже.
Термин 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).1Ñ(u(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 выдает ошибку времени выполнения, также ошибка произойдет, если не осталось данных для считывания (список будущего пуст).
16.3. Записи.
Когда в программе должен быть использован сложный объект данных, удобно иметь общее имя для данных, которые его описывают и объявлять его без явного перечисления имен его частей. Записи Паскаля позволяют дать однажды описание объекта и использовать его далее по общему имени или по именам частей.
Записи позволяют группировать некоторое количество связанных данных, возможно разных типов, в один объект. Каждый элемент данных, называемых полем, состоит из имени, двоеточия и типа. В следующем примере описано два типа записей, Date и WorkerInfo, каждый из которых содержит три поля. Некоторые из полей WorkerInfo таже являются записями. Таким образом, для описания сложных объектов, записи могут быть вложенными.
TYPE Month = (NoMonth, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); DayNum = 1 .. 31; ValidYear = 1850 .. 2050; Date = RECORD Mo: Month; Day: DayNum; Year: ValidYear; END; WorkerInfo = RECORD SSNumber: INTEGER; BirthDay: Date; FirstHired: Date; END; Когда переменная объявляется с типом записи, ее имя ссылается на всю запись. Как общее имя переменная полезна, например при передаче параметров в процедуру. Однако для манипулирования частями записи нужны другие имена. Поля могут именоваться добавлением их имен из определения типа с именем переменной через точку. Например, переменная VAR Worker: WorkerInfo; описывает Worker как запись с тремя полями SSNumber, BirthDay и FirstHired. Имена частей этой переменной будут Worker.SSNumber Worker.BirthDay Worker.FirstHired Первый элемент является атомарным и ему может быть присвоено значение Worker.SSNumber = 123456789; Две другие части являются записями и мы должны обращаться к их частям. Worker.BirthDay.Mo = Feb; Worker.FirstHired.Day = 22;
|
|||||||||||||||||
|