Операции ввода/вывода
Рассмотрим теперь режим блочного ввода/вывода данных между файлом и областью адресного пространства (буфером). Этот режим отличается значительной скоростью передачи данных, причем скорость пропорциональна размеру одного передаваемого блока – чем больше блок, тем больше скорость.
Для реализации этого режима необходимо использовать только нетипизированные файловые переменные. Размер блока определяется в процедуре открытия файла (Reset, Rewrite). Непосредственно для выполнения операций используются процедуры BlockRead и BlockWrite.
Процедура:
procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
Выполняет запись блока из файла в буфер. Параметр F ссылается на нетипизированную файловую переменную, связанную с нужным файлом.
Параметр Buf определяет любую переменную (число, строку, массив, структуру), в которую читаются байты из файла. Параметр Count содержит число считываемых блоков. Наконец, необязательный параметр AmtTransferred возвращает число реально считанных блоков.
При использовании блочного чтения или записи размер блока необходимо выбирать таким образом, чтобы он был кратен размеру одного значения того типа, который хранится в файле. Например, если в файле хранятся значения типа Double (8 байт), то размер блока может быть равен 8, 16, 24, 32 и т. д. Фрагмент исходного кода блочного чтения при этом выглядит следующим образом:
… var F: File; DoubleArray: array [0..255] of Double; Transfered: Integer; begin if OpenDlg.Execute then AssignFile(F, OpenDlg.FileName) else Exit; Reset(F, 64); BlockRead(F, DoubleArray, 32, Transferee!); CloseFile(F); ShowMessage('Считано '+IntToStr(Transfered)+' блоков'); end; …
Как видно из примера, размер блока установлен в процедуре Reset и кратен размеру элемента массива DoubleArray, в который считываются данные. В переменной Transfered возвращается число считанных блоков. Если размер файла меньше заданного в процедуре BlockRead числа блоков, ошибка не возникает, а в переменной Transfered передается число реально считанных блоков.
Процедура:
procedure BlockWrite(var f: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
Используется аналогично.
Оставшиеся функции ввода/вывода, работающие с файловыми переменными, подробно описаны в табл. 9.1.