Типизированные файлы в Pascal

Обновлено: 03.02.2026

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

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

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

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

var
    f: file of Integer;

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

Произвольный доступ к элементам позволяет открывать типизированный файл и для чтения и для записи как с помощью оператора reset, так и rewrite (а не только для чтения или только для записи как в случае текстовых файлов). Так если файл уже существует, и вы хотите сохранить в нем имеющиеся данные, но изменить их или что-то добавить, то открывать файл надо через reset. Если вы создаете новый файл или полностью перезаписываете существующий, то используется rewrite. При этом имеется возможность считывать и изменять данные, которые были записаны после открытия файла.

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

Чтение из типизированного файла производится оператором read (но не readln), а запись в него — оператором write (но не writeln).

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

FileSize(файловая_переменная)

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

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

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

FilePos(файловая_переменная)

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

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

Второй параметр имеет тип LongInt и задает номер элемента, на который должен переместиться указатель файла. Так, чтобы перейти к элементу с номером 5 (фактически шестому) файла f надо выполнить следующий оператор:

Seek(f, 5);

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

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

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

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

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

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

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

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

type
    Subscriber = record
        surname: String[20];
        tel: LongInt;
    end;

var
    s: Subscriber;
    f: file of Subscriber;
    i: Integer;

begin
    assign(f, 'notebook.dat');
    rewrite(f);

    for i:=1 to 3 do begin
        with s do begin
            write('Surname: ');
            readln(surname);
            write('Phone: ');
            readln(tel);
        end;
        write(f, s);
    end;

    close(f);
end.

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

Surname: Иванов
Phone: +7908
Surname: Smit
Phone: +10734
Surname: Den Johns
Phone: 3721

Если после этого открыть в текстовом редакторе файл notebook.dat, то мы увидим там примерно следующее:

0cd0 98d0 b2d0 b0d0 bdd0 bed0 b200 0000
0000 0000 0000 0000 e41e 0000 0453 6d69
74d0 b0d0 bdd0 bed0 b200 0000 0000 0000
0000 0000 ee29 0000 0944 656e 204a 6f68
6e73 bed0 b200 0000 0000 0000 0000 0000
890e 0000 

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

type
    Subscriber = record
        surname: String[20];
        tel: LongInt;
    end;

var
    s: Subscriber;
    f: file of Subscriber;

begin
    assign(f, 'notebook.dat');
    reset(f);

    while not eof(f) do begin
        read(f, s);
        writeln(s.surname, ' ', s.tel);
    end;

    close(f);
end.

На экране вы увидите:

Иванов 7908
Smit 10734
Den Johns 3721