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

 

При описании типизированных файлов указывается тип элементов. Единицей измерения такого набора данных является сам элемент. Поэтому количество элементов указанного типа и есть размер файла (в элементах).
Описание таких файлов задается в программе либо явно, либо с использованием раздела типов type.
var <файловая переменная>: file of <базовый тип>;

Например,
var f1: file of integer; { переменная f1 описывает файл целых чисел}
f2:file of real;   { переменная f2 описывает файл вещественных чисел}
f2:file of string;  { переменная f3 описывает файл строк символов}

 

Описание файлов с помощью раздела типов type может быть оформлено следующим образом:
type str4 = string[4];
arrT=array[1..5] of real;
recT= record
  family, name:string[30];
  age:0..150;
  sex(m,w)
end;
var g1: file of str4;
g2: file of arrT;
g3: file of recT;

Файл f1 представляет собой совокупность элементов, каждый из которых имеет тип str[4], поэтому отводимое количество памяти на один элемент равно 5 байтам.
Файл f2 представляет собой совокупность одномерных массивов из 5 вещественных чисел в каждом. Поэтому на каждый элемент будет выделено 5*6=30 байтов.
Файл f3 есть файл записей, на каждую из которых отведено 31+31+1+1= 64 байта.

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

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

 

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

Например,
assign(f, 'work.dat') – процедура устанавливает соответствие между файловой переменной f и файлом work.dat. Файл расположен в текущем каталоге.
assign(f, 'c:\winnt\temp\work.dat') – процедура устанавливает соответствие между переменной f и файлом 'work.dat', расположенный на c:\winnt\temp.

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

Для работы с элементами файла определены только две операции: читать элемент из файла и записать значение некоторой переменной в файл.
read(имя файловой переменной, переменная),
write(имя файловой переменой, переменная),
где переменная должна по типу совпадать с базовым типом, заданным при описании файловой переменной.

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

Таким образом, для создания типизированного файла нужно выполнить следующую последовательность действий:
1. Описать файловую переменную.
2. Установить связь файловой переменной с конкретным набором данных на внешнем носителе.
3. Открыть файл для записи.
4. Произвести запись файл.
5. Закрыть файл.

 

Рассмотрим пример создания файла целых чисел с именем work.dat.
var f: file of integer;   { переменная f описывает файл целых чисел }
n,i:integer;
begin
assign(f, ‘work.dat’);  { связали переменную f с файлом work.dat}
rewrite(f);    { открыли файл на запись }
for i:=1 to 10 do   { 10 раз в цикле будем делать }
begin
write(‘введи целое число’); 
read(n);    { ввели целое число с экрана }
write(f, n);   { записали его в файл}
end;
close(f);    { закрыли файл }
End.

Поскольку число элементов файла заранее не задается, то для определения конца файла введена функция EOF (End Of File).

Это логическая функция EOF(имя файловой переменной), которая принимает значение ИСТИНА, если достигнут конец файла,и ЛОЖЬ – в противном случае.

 

Для чтения элементов типизированного файла необходимо выполнить следующие действия:
1. Описать файловую переменную.
2. Установить связь файловой переменной с конкретным набором данных на внешнем носителе.
3. Открыть файл для чтения.
4. Читать элементы файла, пока не достигнут конец файла.
5. Закрыть файл.

 

Прочитаем файл целых чисел work.dat и выведем их сумму на экран.
var f: file of integer;  { переменная f описывает файл целых чисел }
n,i:integer;
sum:longint;
begin
assign(f, ‘work.dat’);  { связать переменную f с файлом work.dat}
reset(f);    { открыть файл на чтение }
sum:=0;
while not eof(f) do  { пока не обнаружен конец файла }
begin
read(f, n);    { прочитали из файла в переменную n }
write(n,’ ‘);   { вывели число n на экран}
sum:=sum+n;
end;
close(f);    { закрыли файл }
end.

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

Повторим, что после операции чтения(read) и записи(write) происходит перемещение текущего указателя на следующий элемент файла.

Для работы с текущим указателем в языке определены следующие функции:
seek(файловая переменная, poz) – функция установки текущего указателя на позицию с номером poz, где poz есть число типа longint.

Не забывайте, что нумерация элементов в файле начинается с 0. Это может послужить причиной возникновения ошибок чтения-записи, что в результате может привести к нарушению целостности информации в файле. Положение усугубляется тем, что неверное позиционирование текущего указателя не приводит к видимым ошибкам ввода-вывода, на которые можно было бы отреагировать. Исключение составляют ситуации, когда указатель настраивается, например, за последний элемент файла и делается попытка считать маркер конца файла в переменную конкретного типа.
filepos(файловая переменная) – функция возвращает текущую позицию указателя в  виде числа типа longint.
filesize(файловая переменная) – функция возвращает размер файла (количество элементов в файле данного типа) в виде целого числа типа longint.

Адрес: 614039, г. Пермь, ул. Комсомольский проспект, 45
Телефон: +7 (342) 212-80-71
E-Mail: school9-perm@ya.ru
Вопрос администратору сайта