Разновидностью двоичных файлов является типизированные файлы. Это такие файлы, для которых определен формат, или структура файла, а также тип данных для сохраняемой в нем информации.
Типизированные файлы обеспечивают ввод/вывод с учетом конкретного типа данных. Для объявления типа данных используется ключевое слово file of, к которому добавляется тип данных. Например, для работы с файлом, содержащим набор байтов, файловая переменная объявляется так:
var ByteFile: file of byte;
При этом можно использовать любые типы фиксированного размера, за исключением указателей. Разрешается использовать структурные типы, если их составные части удовлетворяют названному выше ограничению. Например, можно создать файловую переменную для записи:
type Country = record
Name: String;
Capital: String;
Population: Longint;
Square: Longint
end;
И далее объявляем файл следующим образом:
var CountryFile: file of Country;
С каждой файловой переменной связан указатель, указывающий на текущую запись, которую можно прочитать или переписать, либо на признак конца файла. Установить указатель в нужное значение можно с помоью процедуру Seek. Нумерация записей в файле начинается с нуля.
|
|
Построение базы данных “Адресная книга”
Хорошим примером использования типизированных файлов является простая программа создания телефонно-адресной книги. Это приложение – база данных, созданная без использования инструментальных средств баз данных.
Когда программа запускается в первый раз, она определяет, присутствует ли файл данных address.dat. Если такого файла нет, то программа создает файл с таким именем, в котором и хранится вся информация.
AddressFile – это файловая переменная типа Address. AddressData – это переменная типа Address. В такой переменной хранятся фамилия, имя, телефон, адрес и индекс человека.
Address = record
Lastname:string[20];
Firstname:string[20];
Phone: string[15];
StreetAddress:string[50];
Index: string[6];
end;
Поскольку новый тип Address является записью, AddressData становится буфером со структурой типа Address.Это позволяет читать и записывать данные в буфер при помощи одного оператора, сохраняя их упорядоченность. Каждая запись, сохраненная на диске, будет иметь один и тот же размер независимо от вводимых данных. Это называется записью фиксированной длины, и в этом сущность типизированных файлов.
Кнопка Сохранить записывает данные в файл. Кнопки Предыдущая и Последующая позволяют перемещаться назад и вперед по базе данных от одной записи к другую. Кнопка Закрыть позволяет выйти из приложения.
type
Address = record
Lastname:string[20];
Firstname:string[20];
Phone: string[15];
StreetAddress:string[50];
Index: string[6];
end;
var
AddressFile: File of Address;
AddressData: Address;
Fname:String;
RecSize,CurRec:Longint;
procedure TForm1.Button5Click(Sender: TObject);
|
|
begin
SaveRecord;
CloseFile(AddressFile);
Application.Terminate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClearData;
CurRec:=0;
Fname:='Address.DAT';
AssignFile(AddressFile,Fname);
RecSize:=SizeOf(AddressData);
if FileExists(Fname) then
begin
Reset(AddressFile);
If not Eof(AddressFile) then
begin
Read(AddressFile,AddressData);
ShowRecord;
end;
end
else
begin
ClearData;
Rewrite(AddressFile);
end;
end;
procedure TForm1.ClearData;
begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Edit5.Text:='';
end;
procedure TForm1.SaveRecord;
begin
AddressData.Lastname:=Edit1.Text;
AddressData.Firstname:=Edit2.Text;
AddressData.Phone:=Edit3.Text;
AddressData.StreetAddress:=Edit4.Text;
AddressData.Index:=Edit5.Text;
Write(AddressFile,AddressData);
end;
procedure TForm1.ShowRecord;
begin
Form1.Edit1.Text:=AddressData.Lastname;
Form1.Edit2.Text:=AddressData.Firstname;
Form1.Edit3.Text:=AddressData.Phone;
Form1.Edit4.Text:=AddressData.StreetAddress;
Form1.Edit5.Text:=AddressData. Index;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
SaveRecord;
ShowRecord;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if CurRec-1<0 then
begin
CurRec:=0;
Seek(AddressFile,CurRec);
ShowMessage('Это начало файла');
end
else
begin
CurRec:=CurRec-1;
Seek(AddressFile,CurRec);
Read(AddressFile,AddressData);
Seek(AddressFile,CurRec);
ShowRecord;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
repeat
CurRec:=CurRec+1;
Seek(AddressFile,CurRec);
until Eof(AddressFile);
ClearData;
SaveRecord;
Seek(AddressFile,CurRec);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
CurRec:=CurRec+1;
Seek(AddressFile,CurRec);
if not Eof(AddressFile) then
begin
Read(AddressFile,AddressData);
Seek(AddressFile,CurRec);
ShowRecord;
end
else
begin
CurRec:=CurRec-1;
Seek(AddressFile,CurRec);
ShowMessage('Это конец файла');
end;
end;
end.
Задание для самостоятельной работы.
Добавить в вышеописаннуюпрограмму возможность удалять записи.
Задание для самостоятельной работы.
Создать СУБД “Наличие товара на складе”. Запись должна содержат следующие поля: наименование товара, количество, стоимость единицы хранения. СУБД должна выполнять следующие оперпации: заносить данные в базу, осуществлять поиск записи по наименованию товара, удалять запись, сообщать по запросу полную стоимость товара на скаладе.