Основные виды работ с типизованными файлами
Ниже приведенные процедуры используют следующие описания:
Type
Kniga = Record
Nomer : Integer ;
Avtor : String [ 20 ] ;
Nazv : String [ 50 ] ;
God : Integer
end ;
Var
Spisok : File of Kniga ;
Kn : Kniga ;
FileName : String [ 12 ] ;
Последовательная (начальная) организация (формирование) файла:
Для последовательного создания файла необходимо выполнить:
связать файловую переменную с именем создаваемого файла (дать файлу имя): Assign
открыть новый файл: ReWrite
чаще всего в цикле:
подготовить информацию (компоненту) для вывода в файл
записать компоненту в файл: Write
закрыть файл: Close
Рассмотрим пример занесения в файл списка литературы (см. описания выше):
Procedure PoslOrg ;
Begin
Write ( ‘Дайте имя файлу: ’ ) ;
ReadLn ( FileName ) ;
Assign ( Spisok, FileName ) ;
ReWrite ( Spisok ) ;
While True do
With Kn do
Begin
Write ( ‘Номер книги (9999 – конец формирования списка): ’ ) ;
ReadLn ( Nomer ) ;
If Nomer = 9999 then
Begin
Close ( Spisok ) ;
Exit
End ;
Write ( ‘ФИО автора: ’ ) ;
ReadLn ( Avtor ) ;
Write ( ‘Название книги: ’ ) ;
ReadLn ( Nazv ) ;
Write ( ‘Год издания: ’ ) ;
ReadLn ( God ) ;
Write ( Spisok, Kn )
End
End ;
Последовательная обработка файла:
Для последовательной обработки файла необходимо выполнить:
связать файловую переменную с именем обрабатываемого файла: Assign
открыть существующий файл: ReSet
чаще всего в цикле:
последовательно считать компоненты до нужной компоненты: Read
выполнить обработку
закрыть файл: Close
В качестве примера рассмотрим чтение и вывод на экран всего файла, созданного предыдущей процедурой:
Procedure PoslObr ;
Begin
Write ( ‘Дайте имя файлу: ’ ) ;
ReadLn ( FileName ) ;
Assign ( Spisok, FileName ) ;
ReSet ( Spisok ) ;
While Not EoF ( Spisok ) do
With Kn do
Begin
Read ( Spisok, Kn ) ;
WriteLn ( Nomer : 4, Avtor : 20, Nazv : 50, God : 6 )
End ;
Close ( Spisok )
End ;
Расширение файла (дополнительная запись новых компонент):
Для расширения файла необходимо выполнить:
связать файловую переменную с именем расширяемого файла: Assign
открыть существующий файл: ReSet
установить указатель за последней компонентой файла: удобнее с помощью Seek
чаще всего в цикле:
подготовить новую компоненту для вывода в файл
записать компоненту в файл: Write
закрыть файл: Close
Procedure Rassh ;
Begin
Write ( ‘Дайте имя файлу: ’ ) ;
ReadLn ( FileName ) ;
Assign ( Spisok, FileName ) ;
ReSet ( Spisok ) ;
Seek ( Spisok, FileSize( Spisok ) ) ;
While True do
With Kn do
Begin
Write ( ‘Номер книги (9999 – конец формирования списка): ’ ) ;
ReadLn ( Nomer ) ;
If Nomer = 9999 then
Begin
Close ( Spisok ) ;
Exit
End ;
Write ( ‘ФИО автора: ’ ) ;
ReadLn ( Avtor ) ;
Write ( ‘Название книги: ’ ) ;
ReadLn ( Nazv ) ;
Write ( ‘Год издания: ’ ) ;
ReadLn ( God ) ;
Write ( Spisok, Kn )
End
End ;
Корректировка файла по ключу:
Для корректировки файла необходимо выполнить:
связать файловую переменную с именем корректируемого файла: Assign
открыть существующий файл: ReSet
чаще всего в цикле:
подвести указатель к корректируемой компоненте файла: Seek
считать корректируемую компоненту: Read
откорректировать нужные поля
повторить подвод указателя к нужной компоненте файла: Seek
записать откорректированную компоненту в файл: Write
закрыть файл: Close
Откорректируем в созданном файле годы издания некоторых книг (для новых изданий этих книг):
Procedure KorrKl ;
Var
NovGod, i, k, kl : Integer ;
Begin
Write ( ‘Дайте имя файлу: ’ ) ;
ReadLn ( FileName ) ;
Assign ( Spisok, FileName ) ;
ReSet ( Spisok ) ;
Write ( ‘Число корректируемых записей: ’ ) ;
ReadLn ( k ) ;
For i := 1 to k do
With Kn do
Begin
Write ( ‘Номер кооректируемой записи: ’ ) ;
ReadLn ( kl ) ;
Write ( ‘Новый год издания: ’ ) ;
ReadLn ( NovGod ) ;
Seek ( Spisok, kl - 1 ) ;
Read ( Spisok, Kn ) ;
God := NovGod ;
Seek ( Spisok, kl - 1 ) ;
Write ( Spisok, Kn )
End ;
Close ( Spisok )
End ;
Обработка файла по ключу:
Необходимо выполнить:
связать файловую переменную с именем файла: Assign
открыть существующий файл: ReSet
чаще всего в цикле:
подвести указатель (по ключу) к нужной компоненте файла: Seek
считать компоненту: Read
выполнить обработку
закрыть файл: Close
Выведем некоторые записи из списка:
Procedure ObrKl ;
Var
kl : Integer ;
Begin
Write ( ‘Дайте имя файлу: ’ ) ;
ReadLn ( FileName ) ;
Assign ( Spisok, FileName ) ;
ReSet ( Spisok ) ;
While True do
Begin
Write ( ‘Ключ выводимой записи (9999 – выход): ’ ) ;
ReadLn ( kl ) ;
If kl = 9999 then
Begin
Close ( Spisok ) ;
Exit
End ;
Seek ( Spisok, kl - 1 ) ;
Read ( Spisok, Kn ) ;
With Kn do
WriteLn ( Nomer : 4, Avtor : 20, Nazv : 50, God : 6 )
End
End ;
Организация файла произвольного доступа (форматирование файла):
Занесем в файл фиктивные записи (например, пробелы и нули) для возможности в будущем заносить в файл записи на нужные места:
Procedure FormatirFile ;
Var
i, Razmer : Integer ;
Begin
Write ( ‘Дайте имя файлу: ’ ) ;
ReadLn ( FileName ) ;
Assign ( Spisok, FileName ) ;
ReWrite ( Spisok ) ;
Write ( ‘Начальный размер файла: ’ ) ;
ReadLn ( Razmer ) ;
For i := 1 to Razmer do
With Kn do
Begin
Nomer := i ;
Avtor := ‘ ’ ;
Nazv := ‘ ’ ;
God := 0 ;
Write ( Spisok, Kn )
End ;
Close ( Spisok )
End ;
Загрузка (создание) отформатированного файла по ключу:
По ключу заносится фактическая информация, которая замещает фиктивную:
Procedure ZagrKl ;
Var
i, k, kl : Integer ;
Begin
Write ( ‘Дайте имя файлу: ’ ) ;
ReadLn ( FileName ) ;
Assign ( Spisok, FileName ) ;
ReSet ( Spisok ) ;
Write ( ‘Число создаваемых записей: ’ ) ;
ReadLn ( k ) ;
For i := 1 to k do
With Kn do
Begin
Write ( ‘Номер книги: ’ ) ;
ReadLn ( Nomer ) ;
kl := Nomer ;
Write ( ‘ФИО автора: ’ ) ;
ReadLn ( Avtor ) ;
Write ( ‘Название книги: ’ ) ;
ReadLn ( Nazv ) ;
Write ( ‘Год издания: ’ ) ;
ReadLn ( God ) ;
Seek ( Spisok, kl - 1 ) ;
Write ( Spisok, Kn )
End ;
Close ( Spisok )
End ;