Файлы с прямым и последовательным доступом (Лабораторная работа № 15), страница 2

Чтение доступного элемента файла задается процедурой READ. Её вызов имеет вид:                                                  

Read(fv)

где v – имя переменной того же типа, что и у элементов файла. В результате значение доступного элемента присваивается этой переменной, а указатель доступного элемента перемещается на следующий элемент.

Например, при чтении read(f, х)файловой переменной f со значением:

(<11, 12, 13>, 0, R)

переменная х приобретает значение 11, а значение f  можно пред­ставить как:

(<11, 12, 13>, 1, R)

т.е. доступным становится элемент 12.

Вообще, если файл содержит n элементов, пронумерованных от 0 до n-1, и номер доступного компонента i меньше n, то вызов read (f, х) задает присваивание переменной х значения i-го элемента и переход от значения файловой переменной (F, i, R) к значению (F, i+1, R). Если же i=n, то говорят, что файл f прочитан, или исчерпан (в частности, если он пустой, т.е. F =<>). При таком значении i вызов read приводит к аварийному завершению программы.

В вызове процедуры read можно указывать произвольное ко­личество аргументов, которые являются именами однотипных переменных:

read(f,   V1, V2,…,VN)

Такой вызов выполняется на самом деле как последователь­ность вызовов:

read(f,   V1);   read(f,   V2) ;   ...  read(f,   Vn)

Разумеется, надо иметь гарантию, что в файле остается достаточно непрочитанных элементов.

Подчеркнем, что к типизированным файлам неприменима про­цедура чтения readln – ее можно применять лишь для чтения текстов.

Определить, достигнут ли конец файла, можно при помощи функции EOF.   Из вызова eof (f)  возвращается булево значение false, если доступен какой-нибудь элемент файла, т.е. i<n в значении файловой переменной (<f0,..., fn-1>, i,  R). Значение true возвращается при i=n, что возможно после чтения всех элементов файла без установки его в начальное состояние.

Вызов функции eofпозволяет определить, есть ли еще в файле непрочитанные элементы, и предотвратить чтение из исчерпанного файла.

Практически всегда программу следует записывать так, чтобы в процессе ее выполнения проверка неисчерпанности файла предшествовала вызову процедуры read.

Пример:

Вывести на экран компьютера данные о студентах из файла, созданного по программе из предыдущего примера.

Будем рассматривать файл как последовательность записей типа Student. Элементы файла по одному читаются во вспомогательную переменную St, и значения ее полей (фамилия, имя и средний балл), имеющие базовый или строчный тип, выводятся на экран с его предварительной очисткой. Очистка экрана задается вызовом процедуры CLRSCR (clearscreen — очистить экран) из модуля Crt. После каждого вывода для получения новых данных следует нажать клавишу [Enter].

В следующей программе используется переменная IOResult, определенная в модуле Dos. Она приобретает ненулевое значение, если при выполнении процедуры Reset возникла какая-то ошибка, например связанная с тем, что пользователь задал имя несуществующего файла. Перед ее вызовом выключается режим проверки правильности ввода-вывода, поскольку в этом режиме при оши­бочном: выполнении Reset программа аварийно завершается. После вызова Reset режим проверки включается снова.

program OutPutGroup;

uses CrtDos;                                 {Подключение модулей Crtи Dos}

type Student = record

Sname,  Name  :  string[20];  

Ball  :  real;

end;

var  Fi  :  file of  Student;

  FileName : string;

 procedure OpenFile;

var Rez  :  Integer;  Ch  :  char;

 begin

Rez:=l;

while Rez<> 0 do begin

{Rez<>0 – правильное  внешнее имя  файла  не  задано}

writeln(‘Задайте имя  файла’);  

гeadln(FileName);

assign (Fi,   FileName);