Смысл последовательного доступа заключается в том, что в каждый
момент времени доступна лишь одна компонента из всей последователь
ности. Для того, чтобы обратиться (получить доступ) к компоненте с
номером К, необходимо просмотреть от начала файла К-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.