{ FileRec(f), R
или, конкретнее,
FileRec( f ).BufSize
Для чтения или записи данных в бестиповый файл стандартные процедуры Read и Write не годятся. Их заменяют здесь процедуры:
BlockRead(VAR f : File; VAR Destin; Count : Word [; VAR ReadIn : Word])
и
BlockWrite(VAR f : File; VAR Source; Count : Word [; VAR WriteOut : Word]).
Эти процедуры осуществляют чтение в переменную Destin и запись из переменной Source не компонентов файла или его строк, а блоков, состоящих из того количества байтов, которое определено для буфера файла f. Если Count больше 1, то за одно обращение будет считано Count емкостей буфера. Значение Count, меньшее единицы, не имеет смысла. Всегда должно выполняться условие:
Count*Размер_буфера < 64K.
Необязательный параметр ReadIn возвращает число блоков (буферов), считанное текущей операцией BlockRead. Аналогичный параметр WriteOut процедуры BlockWrite после каждой операции записи показывает число блоков (буферов), записанное в данный файл этой операцией.
Если операции записи или чтения прошли успешно, то значения ReadIn и WriteOut будут равны соответствующим значениям параметров Count. Но если произошел сбой при вводе-выводе, и заказанное число блоков не перенеслось, то параметры ReadIn и WriteOut будут содержать целое число удачно перенесенных блоков (неудача посередине блока практически равносильна отмене его чтения или записи).
Таким образом, эти параметры могут использоваться для контроля выполнения операций BlockRead и BlockWrite:
VAR
Fr,Fw : File; { файловые переменные }
ReadIn, WriteOut : Word; { переменные контроля }
Destin : ....... ; { приемник при чтении }
Source : ………; { источник при записи }
- 252 -
BEGIN
...
BlockRead( Fr, Destin, 3, ReadIn );
if ReadIn <> 3 then обработка ошибки чтения ;
BlockWrite( Fw, Source, 4, WriteOut );
if WriteOut <> 4 then обработка ошибки записи ;
...
END.
Если в вызове BlockRead последний параметр не указан, то невозможность считать заданное число блоков вызовет ошибку ввода-вывода и остановку программы.
Процедуры BlockRead и BlockWrite не имеют списков ввода и вывода, поскольку не определен тип компонента файла. Взамен их в вызовах присутствуют бестиповые переменные. Адрес начала переменной в памяти соответствует адресу области памяти, начиная с которого заданное количество байт будет выведено в файл при записи или помещено в память из файла при чтении. Передавая переменную процедуре, мы всегда тем самым передаем адрес ее содержимого, точнее, первого байта ее значения. Если переменная X — массив
VAR
X : Array [1..10] of ... ;
то вызов BlockWrite или BlockRead с ней будет принимать за точку начала отсчета блока первый элемент массива. Можно более явно указать в вызове начало блока как X [1]. Но если подставить X[5], то отсчет блока будет вестись уже сразу с пятого элемента массива. Особенно осторожно надо будет обращаться со ссылками при подстановке их в BlockWrite и BlockRead. Ссылки должны быть разыменованы, с тем чтобы показывать на данные, а не на место в памяти, где хранится сама ссылка. Так, если определена ссылочная переменная P: