Следующая программа count иллюстрирует некоторые из этих моментов:
(* Программа count подсчитывает число символов в файле *)
uses linux;
const
BUFSIZE=512;
var
filedes:integer;
nread:longint;
buffer:array [0..BUFSIZE-1] of byte;
total:longint;
begin
total := 0;
(* Открыть файл 'anotherfile' только для чтения *)
filedes := fdopen ('anotherfile', Open_RDONLY);
if filedes=-1 then
begin
writeln('Ошибка при открытии файла anotherfile');
halt(1);
end;
(* Повторять до конца файла, пока nread не будет равно 0 *)
nread := fdread (filedes, buffer, BUFSIZE);
while nread > 0 do
begin
inc(total,nread); (* увеличить total на nread *)
nread := fdread (filedes, buffer, BUFSIZE);
end;
writeln('Число символов в файле anotherfile: ', total);
fdclose(filedes);
halt(0);
end.
Эта программа будет выполнять чтение из файла anotherfile блоками по 512 байт. После каждого вызова fdread значение переменной total будет увеличиваться на число символов, действительно скопированных в массив buffer. Почему total объявлена как переменная типа longint?
Здесь использовано для числа считываемых за один раз символов значение 512, поскольку система UNIX сконфигурирована таким образом, что наибольшая производительность достигается при перемещении данных блоками, размер которых кратен размеру блока на диске, в этом случае 512. (В действительности размер блока зависит от конкретной системы и может составлять до и более 8 Кбайт.) Тем не менее мы могли бы задавать в вызове fdread произвольное число, в том числе единицу. Введение определенного значения, соответствующего вашей системе, не дает выигрыша в функциональности, а лишь повышает производительность программы, но, как мы увидим в разделе 2.1.9, это улучшение может быть значительным.
Упражнение 2.4. Если вы знаете, как это сделать, перепишите программу count так, чтобы вместо использования постоянного имени файла она принимала его в качестве аргумента командной строки. Проверьте работу программы на небольшом файле, состоящем из нескольких строк.