F: File; - переменная типа File; Именно из этой переменной и происходит чтение данных.
Buf: Var; - переменная любого типа. В эту переменную помещаются прочитанные данные.
Size: Word; - количество считываемых байт.
Result: Word; - в эту переменную помещается реальное количество байт, которые были прочитаны.
Работает эта процедура следующим образом: из файла F считывается Size записей, которые помещаются в память, начиная с первого байта переменной Buf. После выполнения процедуры реальное количество прочитанных байт помещается в переменную Result. Здесь надо сказать, что эта переменная совсем не обязательно должна присутсвовать в качестве параметра, то есть ее попросту можно опустить. Однако иногда она довольно полезна и даже необходима - например, если чтение было окончено до того, как было прочитано требуемое количесто байт (достигнут конец файла), мы можем это отследить через переменную Result. Если же в этом случае (чтение данных после конца файла) переменная Result не будет указана, то образуется ошибка времени выполнения N100 "Disk read error" (Runtime error 100).
Вот пример использования этой процедуры:
{ допустим имеем такой файл:
dЦHello!
Здесь:
d - ASCII 100
Ц - ASCII 150
Hello! - строка из 6ти символов
}
type
R = record
A: Byte;
C: Array[1..6] of Char;
end;
var
F: File;
I: Byte;
Rec: R;
Result: Word;
begin
{ связываем файл с переменной }
Assign(F, '1.txt');
{$I-}
Reset(F, 1);
{$I+}
if IOResult<>0 then Halt;
BlockRead(F, I, Sizeof(I), Result);
BlockRead(F, Rec, Sizeof(Rec), Result);
Writeln(I);
Writeln('Rec values: ');
Writeln('A: ', Rec.A);
Writeln('S: ', Rec.C);
Readln;
Close(F);
end.
Обращаю ваше внимание на новую функцию, которую я использовал в этой программе: Sizeof. Эта функция принимает в качестве параметра любую переменную и возвращает ее размер в байтах. Размер переменных стандартных типов (Integer, Byte....) можно найти в таблицах типов из пред. выпусков, в то время как размер определяемых пользователем типов, таких как запись иногда подсчитать довольно не просто. Поэтому SizeOf иногда очень выручает, упрощая работу. Далее хочу указать вам на дополнительный параметр процедуры Reset. Он указывает размер буфера, который используется для передачи данных. В прошлом выпуске, когда я говорил о текстовых файлах и рассказывал о процедуре Reset я не упоминал об этом параметре. Дело в том, что с текстовыми файлами он не используется.
Буфер по умолчанию равен 128 байт. Если его явно не указывать, то Паскаль устанавливает это значение.
Запись в файлы без типа
Ну чтож, с чтением данных вроде разобрались, пора переходить к записи. Для этого в Паскале имеется еще одна, отдельная процедура, а именно BlockWrite. Она очень похожа на предыдущую BlockRead, по крайней мере параметры у этих двух процедур абсолютно одинаковы.