Для типизированных файлов применимы процедуры Assign, Reset, Rewrite, Close, Rename, Erase, Eof, IOResult, рассмотренные ранее. Именно с помощью указанных процедур над типизированными файлами производятся такие операции, как связывание с физическим файлом, открытие и закрытие файла и т.п.
Для организации же ввода-вывода в типизированных файлах используются процедуры Read и Write:
Read(f, X);
Write(f, X);
где f – имя типизированного файла, а Х – переменная с таким же описанием, какое имеет компонента файла.
Выполнение процедуры Read(f, X) состоит в чтении с внешнего устройства одной компоненты файла и записи ее в X. Повторное применение процедуры Read(f, X) обеспечит чтение следующей компоненты файла и запись ее в X.
Пример: напечатать на экране все числа из файла
var
f: file of integer;
x: integer;
begin
assign(f, ‘c:\test.dat’);
reset(f);
while not eof(f) do
begin
read(f, x);
writeln(x);
end;
close(f);
end.
Выполнение процедуры Write(f, X) состоит в записи X в файл как одной компоненты. Повторное применение этой процедуры обеспечит запись X как следующей компоненты файла.
Пример: записать в файл 5 чисел, заданных пользователем
var
f: file of integer;
x: integer;
begin
assign(f, ‘c:\test.dat’);
rewrite(f);
for i:=1 to 5 do
begin
write(‘Введите число для записи в файл: ’);
readln(x);
write(f, x);
end;
close(f);
end.
Для работы с типизированными файлами можно использовать и расширенную форму записи операторов ввода и вывода:
Read(f, X1, X2, …, XK);
Write(f, X1, X2, …, XK);
Здесь f – типизированный файл, а переменные Х1, Х2, … ХК должны иметь тот же тип, что и объявленный тип компонент файла f.
Пример: записать в файл 5 чисел
var
f: file of integer;
x: integer;
begin
assign(f, ‘c:\test.dat’);
rewrite(f);
write(f, 10, 12, 32, 43, 24);
close(f);
end.
К типизированным файлам можно организовать не только последовательный, но и прямой доступ.
Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться (получить доступ) к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующую компоненту. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда следует, что процессы записи и чтения компонент файла не могут произвольно чередоваться. Файл вначале строится при помощи последовательного добавления компонент в конец, а затем может последовательно просматриваться от начала до конца.
Рассмотренные ранее средства работы с файлами обеспечивают именно последовательный доступ.
Прямой доступ означает возможность заранее определить в файле блок, к которому будет применена операция ввода-вывода. В случае нетипизированных файлов блок равен размеру буфера, для компонентных файлов блок – это одна компонента файла.
Прямой доступ предполагает, что файл представляет собой линейную последовательность блоков. Если файл содержит n блоков, то они нумеруются от 1 до n. Кроме того, вводится понятие условной границы между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 1, граница с номером 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 должен быть задан номер условной границы, которая должна стать текущей позицией. Естественно, что процедура Seek работает с открытыми файлами.
Процедура Truncate(var f) устанавливает в текущей позиции признак конца файла и удаляет (стирает) все последующие блоки.
Пример: если файл содержит более 10 компонент, то удалить все компоненты, следующие после 10-ой.