Бестиповые и компонентные файлы состоят из блоков одинакового размера. В бестиповом файле размер блока равен длине буфера, а в компонентном — длине компоненты. Это позволяет применить к таким файлам прямой доступ, при котором операции выполняются с заданным блоком. Прямой доступ применяется только для физических файлов, расположенных на дисках.
С помощью стандартной процедуры seek производится установка текущей позиции в файле на начало заданного блока, и следующая операция чтения-записи выполняется, начиная с этой позиции. Первый блок файла имеет номер 0.
Ниже описаны стандартные подпрограммы для реализации прямого доступа.
filepos (var f) : longint
Функция возвращает текущую позицию в файле f. Для только что открытого файла это будет 0.
filesize (var f) : longint
Функция возвращает количество блоков в открытом файле f.
seek (var f; n: longint)
Процедура выполняет установку текущей позиции в открытом файле (позиционирование). В параметре n задается номер блока, к которому будет выполняться обращение.
truncate (var f)
Процедура устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки.
Пример. Программа, которая выводит на экран заданную по номеру запись из файла, сформированного в пример 3.6.
</em><code>program get_bfile;
var buf : array[1 .. 4] of real;
f : file;
i, k : integer;
filename : string;
begin
{$I–}
writeln('Введите имя входного файла'); readln(filename);
assign(f, filename);
reset(f, sizeof(real) * 4);
if IOResult <> 0 then begin
writeln('Файл ', filename, ' не найден'); exit end;
{$I+}
while true do begin
writeln('Введите номер записи или –1 для окончания');
readln(k);
if (k > filesize(f)) or (k < 0) then begin
writeln('Такой записи в файле нет',); exit end;
seek(f, k);
blockread(f, buf, 1);
for i:= 1 to 4 do write(buf[i]:6:1);
end;
close(f);
end.