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

Сентябрь 25, 2010 / Автор AlexR / Рубрики Учебник по паскалю / Комментировать

Как упоминалось ранее, для того, чтобы создать типизированный файл, нужно объявить файловую переменную с любым типом, даже с составным, который Вы создали сами. Общий синтаксис объявления такой переменной:

var <имя ф.п.>: file of <тип>;

Для работы с типизированными файлами, кроме общих команд для всех файлов, используют следующие:

FilePos (<имя ф.п.>); — возвращает положение указателя в файле.

FileSize (<имя ф.п.>); — возвращает количество элементов в файле.

Seek (<имя ф.п.>; <номер элемента>); — перемещает указатель на конкретный элемент в файле.

Truncate (<имя ф.п.>); — удаляет все элементы в файле с позиции указателя.

Пример:

program PutGetBirthday;
type TBirthday = record
    day: 1..31;
    month: 1..12;
    year: 1..2010;
end;

type TFIO = record
    Family: string [50];
    Name: string [50];
    Otch: string [50];
end;

type TLichn = record
    FIO: TFIO;
    Birt: TBirthday;
end;

var p:TLichn;
    f:file of TLichn;
    ans:string[3];
    i,n:byte;

Begin

    Assign (f,'C:\\temp\Birthdays.txt');
    Rewrite (f);
    n:=1;

    //Вводим данные
    repeat
        writeln ('Ввод ',n,'-го человека:');
        write ('Введите фамилию:');
        readln (p.FIO.family);
        write ('Введите имя:');
        readln (p.FIO.name);
        write ('Введите отчество:');
        readln (p.FIO.Otch);
        write ('Введите день рождения ДД ММ ГГ:');
        readln (p.Birt.day, p.Birt.month, p.Birt.year);
        write (f,p);
        write ('Продолжить ввод?(да/нет):');
        readln (ans);
        n:=n+1;
    until ans='нет';

    //Для того, чтобы вывести все на экран, передем к началу файла
    seek (f,0);
    i:=0;
    //Выведем на экран записанную в файле информацию
    while i<n-1 do begin
        writeln ('');
        writeln ('Вывод ',i+1,'-го человека:');
        read (f,p);
        writeln ('ФИО:',p.FIO.family,' ',p.FIO.name,' ',p.FIO.Otch);
        writeln ('ДР:',p.Birt.day,'.',p.Birt.month,'.', p.Birt.year);
        i:=i+1;
    end;

    close (f);

end.&#91;/source&#93;

Данная программа работает визуально абсолютно одинаково, как и программа, приведенная в примере с <a href="http://pcfu.ru/tekstovye-fajly/" target="_blank">текстовыми файлами</a>. На самом деле, как видно, это не так. В данном случае процесс более оптимизирован и выполняется гораздо быстрее, требует меньше выделяемой памяти под все созданные типы. Но на выходе файл получается гораздо больше размером, чем текстовый, и его нельзя прочитать, если не использовать специальную программу, либо программу вроде этой.

<span style="text-decoration: underline;">Примечание</span>:

Я заметил небольшое отличие в работе компилятора PascalABC и PascalABC. NET. Данная программа будет выполняться и там и там. Но, если обозначить тип TFIO следующим образом:

type TFIO = record
    Family: string;
    Name: string;
    Otch: string;
end;

То есть убрать длину строки у типа string, то компилятор в PascalABC. NET выдаст ошибку о том, что переменная f не может быть типизированной файловой переменной с типом TLichn. В PascalABC компилятор не обращает на это внимание.

Вернуться к оглавлению

Комментарии закрыты.