Системное программирование в UNIX средствами Free Pascal


         

Указатель чтения-записи - часть 2


Следующая программа 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 так, чтобы вместо использования постоянного имени файла она принимала его в качестве аргумента командной строки. Проверьте работу программы на небольшом файле, состоящем из нескольких строк.




Содержание  Назад  Вперед