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

{$I-}                       {Отключение контроля правильности чтение/записи}

reset (Fi) ;

{$1+}                                          {Включение контроля}

Rez:=IOResult;

if Rez<>0  thenbegin

writeln('Проверьте правильность имени файла!');

writeln('Будет ли повторное задание имени? "Y"/"N":');

readln(Ch);

If   (Ch =  ‘n’)   or   (Ch =  ‘N’)   then halt(0);           

{Выход из программы}

end;

end;  

end;

procedure  OutPutFile;

var St  :  Student;  Ch  :  char;

begin

writeln(‘Хотите просмотреть данные о студентах? “Y”/”N”);

readln(Ch);

if (Ch = ‘Y’) or (Ch = ‘y’) then

while not eof(Fi) do begin

read(Fi, St);

clrscr;

       writeln(‘Фамилия:           ‘,St.SName);    

     writeln(‘Имя:                   ‘, St.Name);

     writeln(‘Среднийбалл:   ‘, St.Ball);

   writeln(‘Для продолжения нажмите [Enter]’);

readln;

end;

close(Fi);

end;

begin

clrscr;

writeln(‘Программа печати данных о студента’);

openfile;

    outPutfile

end.

2.  Прямой доступ в системе Turbo Pascal

Как мы поняли из трех предыдущих разделов, доступность эле­мента файла, возможность его чтения или создания в процессе вы­полнения программы, зависит от его расположения в последователь­ности. До сих пор мы рассматривали подпрограммы последовательного доступа к элементам файла. Последовательный доступ заключается в том, что элементы файла не задаются явно, а их доступность в ходе выполнения программы целиком определяется расположением в по­следовательности. Сначала доступен первый элемент, после его обработки — второй и т.д.

Но последовательный доступ к элементам далеко не всегда удобен. Не задумывались ли вы над тем, как запрограммиро­вать чтение элемента из типизированного файла по его номеру или его замену, добавление или удаление?

Понятно, что задать чтение элемента по номеру k можно так:

reset (f) ;

for i:=l to k-1 do read(f, x) ;

{пропущен k-1 элемент – доступен k-й}

read(f, x)

Для замены элемента файла по его номеру k можно “выйти на него” путем чтения предшествующих элементов. Далее можно воспользоваться одним недостатком системы Turbo Pascal. Дело в том, что система позволяет в состоянии чтения записывать в файл значения переменных (и только переменных!). Итак, замену элемента можно описать так:

reset (f) ;

for  i:=l  to k-1  doread(f,   x);;

{пропущен k-1  элемент - доступен k-й}

х:=...;  

write(f,   х)

Самые пытливые читатели могут попробовать самостоятельно описать в таком же духе удаление и добавление элемента к файлу. Но все это “штучки”, которыми не следует пользоваться.

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

Основной является процедура SEEK. В ее вызове задается имя файловой  переменной  и  номер того элемента файла, который становится доступным после выполнения вызова. Номер задавётся выражением типа Longlnt. Например, после вызова:

Seek   (f,   2)

доступным становится третий элемент, поскольку нумерация начинается с 0:

 


Значение именно этого элемента будет читаться при выполнении вызова процедуры ввода read, или этому элементу будет что-то присваиваться при выполнении write. В обоих случаях доступным станет следующий элемент:

 


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

В системе Turbo Pascal есть также несколько вспомогательных процедур, которые применяются вместе с процедурой Seek.