возвращает значение True, если указатель установлен за последней компонентой файла (констатирует конец файла), и False — в противном случае
FilePos ( var F ) : LongInt;
—
возвращает номер текущей компоненты файла (на которую установлен указатель)
FileSize ( var F ) : LongInt;
—
возвращает текущий размер файла (количество компонент)
IOResult : Word;
—
возвращает значение 0, если последняя операция ввода/вывода завершена успешно, и другое значение — в противном случае (после применения этой функции, ее значение сбрасывается в 0); функцию можно использовать только при наличии ключа компилятора {$I-}
Основные виды работ с типизованными файлами
Ниже приведенные процедуры используют следующие описания:
Type
Kniga= Record
Nomer:Integer;
Avtor:String [ 20 ];
Nazv:String [ 50 ];
God:Integer
end ;
Var
Spisok : File ofKniga;
Kn :Kniga;
FileName:String [ 12 ];
Последовательная (начальная) организация (формирование) файла:
Для последовательного создания файла необходимо выполнить:
· связать файловую переменную с именем создаваемого файла (дать файлу имя): Assign
· открыть новый файл: ReWrite
чаще всего в цикле:
· подготовить информацию (компоненту) для вывода в файл
· записать компоненту в файл: Write
· закрыть файл: Close
Рассмотрим пример занесения в файл списка литературы (см. описания выше):
ProcedurePoslOrg ;
Begin
Write ( ‘Дайте имя файлу: ’ );
ReadLn ( FileName );
Assign ( Spisok,FileName );
ReWrite ( Spisok );
WhileTrue do
WithKn do
Begin
Write ( ‘Номер книги (9999 – конец формирования списка): ’ );
ReadLn ( Nomer );
IfNomer = 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
В качестве примера рассмотрим чтение и вывод на экран всего файла, созданного предыдущей процедурой:
ProcedurePoslObr ;
Begin
Write ( ‘Дайте имя файлу: ’ );
ReadLn ( FileName );
Assign ( Spisok,FileName );
ReSet ( Spisok );
WhileNot EoF ( Spisok ) do
WithKn do
Begin
Read ( Spisok,Kn );
WriteLn ( Nomer :4,Avtor :20,Nazv :50,God :6 )
End ;
Close ( Spisok )
End ;
Расширение файла (дополнительная запись новых компонент):
Для расширения файла необходимо выполнить:
· связать файловую переменную с именем расширяемого файла: Assign
· открыть существующий файл: ReSet
· установить указатель за последней компонентой файла: удобнее с помощью Seek
чаще всего в цикле:
· подготовить новую компоненту для вывода в файл
· записать компоненту в файл: Write
· закрыть файл: Close
ProcedureRassh ;
Begin
Write ( ‘Дайте имя файлу: ’ );
ReadLn ( FileName );
Assign ( Spisok,FileName );
ReSet ( Spisok );
Seek ( Spisok,FileSize( Spisok ));
WhileTrue do
WithKn do
Begin
Write ( ‘Номер книги (9999 – конец формирования списка): ’ );
ReadLn ( Nomer );
IfNomer = 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
Откорректируем в созданном файле годы издания некоторых книг (для новых изданий этих книг):
ProcedureKorrKl ;
Var
NovGod,i,k,kl :Integer;
Begin
Write ( ‘Дайте имя файлу: ’ );
ReadLn ( FileName );
Assign ( Spisok,FileName );
ReSet ( Spisok );
Write ( ‘Число корректируемых записей: ’ );
ReadLn ( k );
Fori:= 1 tokdo
WithKn 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
Выведем некоторые записи из списка:
ProcedureObrKl ;
Var
kl :Integer;
Begin
Write ( ‘Дайте имя файлу: ’ );
ReadLn ( FileName );
Assign ( Spisok,FileName );
ReSet ( Spisok );
WhileTrue do
Begin
Write ( ‘Ключ выводимой записи (9999 – выход): ’ );
ReadLn ( kl );
Ifkl = 9999 then
Begin
Close ( Spisok );
Exit
End ;
Seek ( Spisok,kl - 1);
Read ( Spisok,Kn );
WithKn do
WriteLn ( Nomer :4,Avtor :20,Nazv :50,God :6 )
End
End ;
Организация файла произвольного доступа (форматирование файла):
Занесем в файл фиктивные записи (например, пробелы и нули) для возможности в будущем заносить в файл записи на нужные места:
ProcedureFormatirFile ;
Var
i,Razmer :Integer;
Begin
Write ( ‘Дайте имя файлу: ’ );
ReadLn ( FileName );
Assign ( Spisok,FileName );
ReWrite ( Spisok );
Write ( ‘Начальный размер файла: ’ );
ReadLn ( Razmer );
Fori:= 1 toRazmerdo
WithKn do
Begin
Nomer:= i;
Avtor:= ‘ ’ ;
Nazv:= ‘ ’ ;
God:= 0;
Write ( Spisok,Kn )
End ;
Close ( Spisok )
End ;
Загрузка (создание) отформатированного файла по ключу:
По ключу заносится фактическая информация, которая замещает фиктивную: