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

04.01.2011
Первый мой курсовой проект подразумевал работу с типизированными файлами. В принципе при работе с ними нет ничего трудного, но всё же заметка возможно кому либо пригодится.

Структуры
Как можно догадаться из названия "Типизированный файл" - это файл в котором записанны идентичные структуры, т.е. для начала нам объявить структуру в разделе type. К примеру структура будет содержать данные: Группа, фамилия, имя, отчество, возраст. В итоге имеем вот такой код:
TStudent = record

Group: string[10];
Firstname: string[30];
Surname: string[30];
Patronymic: string[30];
Age: integer;
end;

Т.е. с помощью структур мы собираем в одну кучу разные переменные. А обращаемся к каждой переменной ссылаемся следующим способом Record.field (в нашем случае, как пример TStudent.Group). Но заметка не об этом и как работать с ними, будем считать, вы умеете.
1) Чтение из файла.
procedure TForm1.Button1Click(Sender: TObject);

var
//Объявляем файл типа структуры TStudent и экземпляр структуры TStudent
f: file of TStudent;
Student: TStudent;
begin
//Связываем дескриптор f с файлом stud.dat
AssignFile(f, 'stud.dat');
//Открываем файл для чтения
Reset(f);
//Читаем содержимое файла до конца
while not Eof(f) do
begin
read(f, Student);
//Выводи на экран имя и возраст студента
showmessgae(Student.Firstname + ' ' + Student.Age);
end;
//Закрываем файл
CloseFile(f);
end;

Комментарии в самом коде объясняют практически каждую строчку так что перейдем к следующему шагу
2) Записи в файл.
procedure TForm1.Button2Click(Sender: TObject);

var
//Объявляем файл типа структуры TStudent и экземпляр структуры TStudent
f: file of TStudent;
Student: TStudent;
begin
//Связываем дескриптор f с файлом stud.dat
AssignFile(f, 'stud.dat');
//Открываем файл для записи
Rewrite(f);
//Присваиваем параметры студенту
Student.Group := 'АСУ-10';
Student.Firstname := 'Василий';
Student.Surname := 'Иванов';
Student.Patronymic := 'Петрович';
Student.Age := 20;
//Записываем структуру в файл
write(f, Student);
//Закрываем файл
CloseFile(f);
end;

3) Сортировка внутри файла
procedure TForm1.Button3Click(Sender: TObject);

var
i: integer;
//Объявляем файл типа структуры TStudent и два экземпляря структуры TStudent
f: file of TStudent;
Student1, Student1: TStudent;
begin
//Связываем дескриптор f с файлом stud.dat
AssignFile(f, 'stud.dat');
//Открываем файл для чтения
Reset(f);
//Перебираем все записи в файле
for i := filesize(f) - 1 downto 1 do
for j := 0 to i - 1 do
begin
//Переходим к записи под номером j
seek(f, j);
//Считываем её и следующую за ней запись
read(f, Student1, Student2);
//Сравниваем и если вторая запись больше первой - меняем их местами, перезаписью
if (Student1.age < Student2.age) then
begin
seek(f,j);
write(f, Student2, Student1);
end;
end;
end;

Здесь у нас две новые фенкции, первая это filesize() - она возвращает количество записей в файле.
А функция seek() позволяет перемещать курсор по файлу, т.е. если нам надо прочитать только третью запись, с помощью этой функции мы переходим к третьей записи и читаем её (seek(filename, 3)).