Хелпикс

Главная

Контакты

Случайная статья





Нетекстовые файлы.



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).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;

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.