Типизированные файлы | Язык Паскаль

Типизированные файлы в Паскаль

Более характерным для Pascal являются типизированные файлы, или файлы произвольного доступа. Основным свойством этих файлов является то, что их структура данных представляет собой последовательность компонентов одного типа.

При описании типизированных файлов указывается тип его компонентов, число которых (длина файла) не фиксируется:

var имя_файла: file of тип_компонентов

Поскольку известен тип элементов файла, а следовательно, и объем памяти, отводимой под каждый из них, можно рассчитать позицию каждого из элементов внутри файла. Это позволяет организовать непосредственный доступ к любому элементу типизированного файла. Пусть имеется такое определение переменной:

var 
    FileInt: file of Integer;

В этом описании указано, что элементами файла являются данные типа Integer, занимающие 2 байта (или 4). При этом отпадает необходимость в специальном разделении элементов файла, как это делалось в текстовых файлах. Также возможен произвольный доступ к элементам данных (этим типизированный файл несколько напоминает одномерный массив).

Чтобы можно было работать с типизированным файлом, необходимо, как и для текстовых файлов, сначала связать имя файловой переменной с внешним именем файла (оператор assign). Затем нужно открыть его (используются операторы reset или rewrite).

Операторы reset и rewrite открывают файл и для чтения, и для записи (а не только для чтения или только для записи, как при использовании текстовых файлов). Отличие их в том, что оператор reset открывает только существующий файл (если такого файла нет, будет сгенерирована ошибка времени выполнения). С другой стороны, оператор rewrite создает новый файл (если файл с таким именем уже имеется, то он будет уничтожен и создан заново).

При открытии файла с ним связывается текущий указатель файла, который позиционируется на его первый элемент. Оперировать можно только тем элементом файла, на который ссылается указатель файла. При чтении или записи элемента файла происходит автоматическое перемещение указателя на следующий элемент.

Чтение из типизированного файла производится оператором read (но не readln), а запись в него — оператором write (но не writeln). Однако следует помнить, что в списке вывода оператора write могут быть только переменные. Типы элементов файла и типы переменных в списках ввода-вывода должны быть согласуемы по присваиванию. Элементами типизированных файлов могут быть числовые, символьные, булевы, строковые значения, массивы, записи, но не файлы или структуры с файловыми элементами.

Узнать количество элементов типизированного файла (размер файла) можно с помощью функции FileSize, для которой используется следующий синтаксис:

FileSize(имя_файла)

Например, если переменная k имеет тип LongInt, а f – файловая переменная типизированного файла, то выражение k := FileSize(f), записывает в переменную k размер файла f.

Элементы типизированного файла нумеруются с нуля (порядковый номер последнего элемента файла на единицу меньше размера файла). Чтобы узнать, на каком элементе располагается указатель файла, используют функцию FilePos:

FilePos(имя_файла)

Текущим положением указателя можно управлять, для чего служит процедура Seek, которая использует следующий синтаксис:

Seek(имя_файла, номер_элемента)

Второй параметр (тип LongInt) задает номер элемента (отсчет от 0), на который должен переместиться указатель файла. Рассмотрим несколько примеров.

Перейти к пятому (фактически шестому) элементу файла f:

Seek(f, 5);

Перейти к предыдущему элементу:

Seek(f, FilePos(f)-1);

Перейти в конец файла:

Seek(f, FileSize(f)-1);

Как и для текстовых файлов, можно использовать функцию Eof(имя_файла), которая возвращает значение True, если текущий указатель расположен на признаке конца файла (то есть при выполнения равенства FilePos(имя_файла) = FileSize(имя_файла)).

Процедура seek и функции FilePos и FileSize позволяют легко осуществлять коррекцию элементов типизированного файла, имя которого указано в качестве е параметра, начиная с элемента, на котором расположен указатель. Однако уничтожить элемент внутри файла нельзя, для этого файл должен быть перезаписан.

Текстовые файлы могут быть созданы текстовым редактором. Однако типизированные файлы создаются в результате работы какой-либо программы.

Пример записи данных в типизированный файл:

type
    t_subscriber = record
      surname: string[20];
      tel: LongInt;
    end;
 
var
    subscriber: t_subscriber;
    f: file of t_subscriber;
    i: Integer;
 
begin
  Assign(f,'notebook.dat');
  Rewrite(f);
  for i:=1 to 5 do begin
    with subscriber do begin
      Write('Surname: ');
      ReadLn(surname);
      Write('Phone: ');
      ReadLn(tel);
    end;
    Write(f, subscriber);
  end;
  Close(f);
end.

Пример последовательного доступа к типизированному файлу:

type
    t_subscriber = record
      surname: string[20];
      tel: LongInt;
    end;
 
var
    subscriber: t_subscriber;
    f: file of t_subscriber;
    s: string[7];
 
begin
  Assign(f,'notebook.dat');
  Reset(f);
  while not Eof(f) do begin
    Read(f, subscriber);
    with subscriber do begin
      str(tel,s);
      if Copy(s,1,2) = '33' then
        tel := tel+4000000;
    end;
    Seek(f,FilePos(f)-1); // возврат указателя назад
    Write(f,subscriber);
  end;
  Close(f);
end. 

В приведенной программе типизированный файл обрабатывается и как файл последовательного доступа, и как файл произвольного доступа.