Типизированные файлы
Если информацию, которую вы рассчитываете хранить в виде файла, удобнее представить в табличном виде (например, ассортимент товаров в магазине, расписание самолетов или список студентов), то вместо текстового файла целесообразно использовать типизированный файл. Организация работы с типизированными файлами весьма схожа с только что изученными операциями для текстовых файлов.
Допустим, что в файле необходимо хранить информацию о сотрудниках предприятия. Планируемый перечень данных включает фамилию, инициалы работника и его скромную зарплату – всего четыре позиции. В таком случае первый шаг разработчика – определить некоторую структуру данных (в терминах Pascal – записи), способную содержать информацию. Для этой цели опишем запись TPeople, затем при объявлении файловой переменной укажем, что она предназначена для работы с типизированным файлом типа
TPeople.
program ...;
{$APPTYPE CONSOLE}
usesSysUtils;
Type
TPeople = packed record
SurName : string[25];
FName,LName : CHAR;
Money : currency;
end;
varPeople: TPeople;
F : File Of TPeople;
Begin
AssignFile(F,'C:\People.dat'); {связывание файловой переменной с именем файла}
Rewrite(F); //создание файла
TRY
{заполнение полей записи}
WithPeopledo
Begin
SurName:='Петров';
People.FName:='В';
People.LName:='А';
People.Money:=1000;
end;
Write(F,People); //внесение записи
FINALLY
CloseFile(F); //закрытие файла
END;
End.
Если в полях структуры используются строковые данные, то обязательно указывайте количество символов в строковом поле, иначе компилятор не сможет определить размер одной записи в файле.
Повторив пример создания типизированного файла, вы не увидели особых отличий от аналогичной операции формирования файла текстового типа. И в этом случае мы прошли через стандартную последовательность вызова методов AssignFile(), Rewrite(), Write() и Close(), подробно прокомментированных в предыдущем разделе.
Несколько иначе обстоят дела в случаях редактирования типизированного файла или чтения из него информации (см. алгоритм на рис. 4.2). Здесь нам может понадобиться системная переменная FileMode, определяющая режим открытия файла (по умолчанию ее значение равно 2, что предоставляет право для чтения и записи одновременно). Для открытия файла воспользуемся уже известным нам методом Reset() и… Настал черед завести знакомство с весьма полезной процедурой, отвечающей за позиционирование внутреннего указателя файла:
procedure Seek(var F; N: Longint);
Первый аргумент данного метода (как, впрочем, и всех других методов ввода-вывода) требует передачи файловой переменной. Второй параметр определяет, в каком месте файла мы собираемся оказаться. Допустим, что мы рассчитываем поместить указатель в конец файла, тогда наберем следующую строку кода:
Seek(F,FileSize(F)-1); // FileSize() возвращает количество записей
// в типизированном файле
При желании поместить указатель в начале файла надо набрать:
Seek(F,0);
а теперь переместим указатель ровно в середину файла:
Seek(F,FileSize(F) div 2);
На законный вопрос: «А как узнать, в каком месте находится указатель в настоящий момент?» нам ответит еще один метод:
function FilePos(var F): Longint;
И если указатель ссылается на начало файла, то функция вернет нулевое значение, а если на конец, то возвратит значение FileSize(). Следующий метод сообщает о количестве записей в типизированном файле:
functionFileSize(var F): Integer;
Очень важно помнить, что функция определения размера файла возвращает размер не в байтах, а в элементах, из которых состоит файл. В нашем случае элементом файла является запись TPeople, размер которой равен 36 байт. Поэтому, чтобы выяснить физический размер типизированного файла в байтах, необходимо умножить значение FileSize(F) (возвращающее количество записей в файле) на размер этой записи в байтах – SizeOf(TPeople).
То же утверждение в полной мере относится к методам FilePos() и Seek(): и у них в качестве единицы измерения выступает не байт, а номер элемента файла. Методы FileSize() и FilePos() не могут вызываться при работе с текстовыми файлами.
Следующий листинг демонстрирует еще одно важное преимущество типизированного файла – возможность редактировать любой из элементов файла.
Вспомните, что в обычных текстовых файлах мы можем лишь добавлять строки, а здесь приобретаем бесценную возможность вносить изменения в любую запись.
program ...;
{$APPTYPE CONSOLE}
uses SysUtils;
type TPeople = packed record
SurName : string[25];
FName, LName : CHAR;
Money : currency;
end;
var People : TPeople;
F : File Of TPeople;
Begin
AssignFile(F,'c:\People.dat');
FileMode:=1; Reset(F); //открываем файл в режиме «только для записи»
TRY
With People do
Begin
SurName:='Иванов';
People.FName:='С';
People.LName:='Г';
People.Money:=999.5;
end;
Seek(F,0); //позиционируем указатель на первый элемент файла
Write(F,People); //вносим изменения в файл
FINALLY
CloseFile(F);
END;
End.
Вот как должен выглядеть листинг программы, если вдруг потребуется удвоить оклады всем сотрудникам:
AssignFile(F,'c:\People.dat');
FileMode:=2;
Reset(F);
TRY
Дата добавления: 2016-03-15; просмотров: 1126;