34. Последовательный и прямой доступ

 Смысл последовательного доступа заключается в том, что в каждый

момент времени доступна лишь одна компонента из всей  последователь-

ности. Для того, чтобы обратиться (получить доступ) к компоненте с

номером К, необходимо просмотреть от начала файла К-1 предшествующую

компоненту. После обращения к компоненте с номером К можно обращаться

к компоненте с номером К+1. Отсюда следует, что процессы формирования

(записи) компонент  файла и просмотра (чтения) не могут произвольно

чередоваться. Таким образом, файл вначале строится при помощи после-

довательного добавления  компонент в конец, а затем может последова-

тельно просматриваться от начала до конца.

 Рассмотренные ранее средства работы с файлами обеспечивают после-

довательный доступ.

 TURBO PASCAL позволяет применять к компонентным и бестиповым фай-

лам, записанным  на диск, способ прямого доступа. Прямой доступ озна-

чает возможность  заранее определить в файле блок, к которому будет

применена операция ввода - вывода.  В случае бестиповых файлов блок

равен размеру буфера,  для компонентных файлов блок - это одна компо-

нента файла.

 Прямой доступ предполагает, что файл представляет собой линейную

последовательность блоков. Если файл содержит n блоков, то они нуме-

руются от 1 через 1 до n.  Кроме того, вводится понятие условной гра-

ницы между блоками, при этом условная граница с номером 0 расположена

перед блоком с номером 1,  граница с номером 1 расположена перед бло-

ком с номером 2 и,  наконец, условная граница с номером n находится

после блока с номером n.

 Реализация прямого доступа осуществляется с помощью функций и про-

цедур FileSize, FilePos, Seek и Truncate.

 Функция FileSize( var f ): Longint возвращает количество блоков в

открытом файле f.

 Функция FilePos( var f ): Longint возвращает текущую позицию в

файле f. Позиция в файле - это номер условной границы. Для только что

открытого файла текущей позицией будет граница с номером 0. Это зна-

чит, что можно записать или прочесть блок с номером 1. После чтения

или записи первого блока текущая позиция переместится на границу с

номером 1,  и можно будет обращаться к ьлоку с номером 2. После проч-

тения последней записи значение FilePos равно значению FileSize.

 Процедура Seek( var f; N: Longint) обеспечивает назначение текущей

позиции в файле (позиционирование).  В параметре N должен быть задан

номер условной границы, предшествующей блоку, к которому будет произ-

водиться последующее обращение. Например, чтобы работать с блоком 4,

необходимо задать значение N, равное 3. Процедура Seek работает с от-

крытыми файлами.

 Процедура Truncate( var f ) устанавливает в текущей позиции приз-

нак конца файла и удаляет (стирает) все последующие блоки.

 

 Пример. Пусть на НМД имеется текстовый файл ID.DAT, который содер-

жит числовые значения действительного типа по два числа в каждой

строке - значения аргумента и функции соответственно.  Количество пар

чисел не более 200. Составить программу, которая читает файл, значе-

ния аргумента и функции записывает в одномерные массивы, подсчитывает

их количество,  выводит на экран дисплея и записывает в файл компо-

нентного типа RD.DAT.

 

 Program F;

 var

 rArg, rF: Array[1..200] of Real;

 inf: Text;

 outf: File of Real;

 n, l: Integer;

 begin

 Assign(inf,'ID.DAT');

 Assign(outf,'RD.DAT');

 Reset(inf);

 Rewrite(outf);

 n:=0;

 while not EOF(inf) do

 begin

 n:=n+1;

 ReadLn(inf,rArg[n],rF[n])

 end;

 for l:=1 to n do

 begin

 WriteLn(l:2,rArg[l]:8:2,rF[l]:8:2);

 Write(outf,rArg[l], rF[l]);

 end;

 close(outf)

 end.

Электротехника курсовые, лабораторные, практика Математика, физика