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

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

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

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

var 
	FileInt: file of Integer

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

Чтобы можно было работать с типизированным файлом, необходимо, как и для текстовых файлов, сначала связать имя файловой переменной с внешним именем файла (оператор Assign). Затем нужно открыть его (используются операторы Reset и Rewrite, но не Append). Операторы 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, FilePos(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. 

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

Комментарии

помогите!

1. Создать базу данных для варианта 10.
2. Средствами языка программирования Pascal ABC.net создать приложение для обработки созданной БД. При запуске программы все записи БД должны считываться из типизированного файла в массив данных того же типа. В дальнейшем программа должна работать с элементами массива.
3. Требования к программе: БД хранится в типизированном файле; доступ к данным осуществляется посредством меню пользователя, представленного совокупностью пунктов, выводимых на экран.
4. Меню пользователя должно содержать обязательные пункты:
• добавить запись – вводятся значения всех полей новой записи;
• удалить запись – выводится список записей, запрашивается номер удаляемой записи, которая затем удаляется из массивов и БД;
• редактировать запись – выводится список записей, запрашивается номер редактируе-мой записи и вводятся новые значения;
• найти записи по критерию – выводится список записей, запрашивается значение критерия и выдается список записей удовлетворяющих критерию;
• сохранить изменения в файл – запись массива в файл;
• выйти из программы – программа должна спрашивать пользователя: «Вы действи-тельно хотите покинуть программу?».
Вот задание:

10 МузКоллекция (№экспоната*, Название альбома, Автор/Исполнитель, Количество композиций в альбоме, Год издания альбома, Студия звукозаписи, Дата приобретения, Стоимость)

Кто может помогите))

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

>> Элементы типизированного

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

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

То есть, если указатель на последнем элементе, Eof(f)=FALSE?

"Однако уничтожить ЖЛЕМЕНТ

"Однако уничтожить ЖЛЕМЕНТ внутри файла нельзя, для этого файл должен быть перезаписан." возможно "элемент"?

исправлено

исправлено

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

может Уважаемый Учитель наделаем побольше переприсвоений ,например

type
 t_subscriber = record
var
  subscriber: t_subscriber;
 mamapapa:subscriber;
 babadedakum: mamapapa:

чтобы уж совсем было как в каком университете
..что значит "легко осуществить коррекцию"???
мне вот в связи с Вашими объяснениями совсем нелегко
особенно понять как считывать всю инфу из файла
ходишь по инету целый день ,а толкового простого и внятного
объяснения мож раз в месяц и надыбаешь....
все знают что Вы ЭТО знаете .только вот нам то от этого не легче

Опечатка

Перейти в конец файла:
Seek(f, FilePos(f)-1);

FilePos надо заменить на FileSize