Лекция №20. Типизированные файлы. Процедуры и функции для обработки типизированных файлов

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

Длина любого компонента типизированного файла строго постоянна. Это дает возможность организовать прямой доступ к каждому из них по порядковому номеру.

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

В отличие от текстового файла типизированный файл не делится на строки. Данные в нем записаны во внутреннем двоичном представлении ПК. Вообще все файлы, кроме текстовых, рассматриваются, как двоичные.

Для описания типизированных файловых переменных применяются зарезервированные слова file of, например:

F1: File of string [50];

F2: File of integer;

F3: File of real;

1. Перед использованием типизированной файловой переменной, ее необходимо связать с дисковым файлом с помощью процедуры ASSIGN. При вызове процедуры ASSIGNв качестве параметров указывается название переменной и полное имя файла. Например:

Assign(F1,'d:\home\stud17\miras\name.pas’);

2. Процедура Reset –открывает файл уже существующий на диске. Текущая позиция устанавливается в начало файла.

Описание: Reset (F);

3. Процедура Rewrite –создает и открывает файл. Если файл уже существует, то он уничтожается и создается заново.

Описание: Rewrite (F);

4. Процедура Read – прочитать значения указанных переменных из файла.

Описание: Read (F, X1[,X2[,X3[..XN]]]);

F – типизированная файловая переменная

X1..XN – переменные того же типа, что и компоненты файла.

5. Процедура Write –записать значения указанных переменных в файл.

Описание: Write (F, X1[,X2[,X3[..XN]]]);

F – типизированная файловая переменная

X1..XN – переменные того же типа, что и компоненты файла.

Следует помнить, что для чтения и записи типизированного файла применяются только операторы Read и Write.

6. Функция FilePos– возвращает порядковый номер текущего компонента файла. Файл должен быть открыт. Если текущей позицией является начало файла, то функция возвращает значение 0. При переходе от элемента к элементу его значение увеличивается на 1. Эту функцию нельзя использовать в текстовых файлах.

Описание: FilePos(F): LongInt; (-2 147 483 648 – 2 147 483 647).

7. Функция FileSize - возвращает количество компонентов файла. Если файл пуст, то возвращается значение 0.

Описание: FileSize(F): LongInt;

8. Процедура Seek –позиционирует указатель файла на заданный компонент файла.

Описание: Seek (F, L: LongInt);

F –файловая переменная,L –номер компонента, на который будет позиционирован указатель.

9. Процедура Truncate(F)усекает размер файла до его текущей позиции. Файл должен быть открыт. Все элементы после текущей позиции удаляются, после чего текущая позиция становится концом файла. Функция не используется для текстовых файлов.

Описание: Truncate(F);

Пример:

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

type

filtyp = file of integer;

var

f: filtyp;

sum, mult, r, k1, k2, max: integer;

begin

writeln('введите элементы файла по одному в строке, в конце - 0');

assign(f,'data.dat');

rewrite(f);

// записываем в файл числа, вводимые с клавиатуры до 0

repeat

readln(r);

if r <> 0 then write (f,r);

until r = 0;

// позиционируем указатель на 0-ой элемент, т.е на начало файла

seek(f,0);

sum:= 0;

mult:= 1;

// считываем из файла 1-ый элемент, указатель сдвигается вправо на

одну позицию

read(f,r);

// заносим его значение в max для нахождения наибольшего значения

max:= r;

// сдвигаем указатель влево на 1 позицию

seek(f,filepos(f)-1);

// считываем элементы, суммируем, перемножаем и отыскиваем max

while not eof(f) do

begin

read(f,r);

sum:= sum+r;

mult:= mult*r;

if max < r then max:= r;

end;

// позиционируем указатель на 2-ой элемент, запоминаем его значение,

затем позиционируем указатель на предпоследний элемент и

запоминаем его

seek(f,1);

read(f,k1);

seek(f,filesize(f)-2);

read(f,k2);

close(f);

writeln('Сумма = ',sum,#10#13'Произведение = ',mult);

writeln('Разность = ',k2-k1,#10#13'Максимум = ',max);

readln;

end.

Наши рекомендации