Чтобы обработать хранящиеся в файле данные, необходимо получить доступ к компонентам файла. Для этого надо:
Ø присвоить файлу имя (процедура Assign);
Ø открыть уже существующий на диске файл (процедура Reset);
Ø последовательно считать компоненты до нужного (оператор read);
Ø выполнить обработку;
Ø закрыть файл (процедура Close).
Пример.
Вывести на экран содержание всех записей файла. Блок вывода оформить процедурой с именем Оbr. Текст сохранить на диске под именем PОbr.
Procedure Obr;
begin
Assign(BooksFilet, ‘d: BIBL.DOC’);
Reset( BooksFile);
with RecBooks do
while not EOF(BooksFile) do
begin
read (BooksFile, RecBooks);
writeln(Nomer:5, Avtor: 16f Nazv: 10, Index:6)
end;
Close(BooksFile)
end;
Возможны три вида корректировки последовательного файла:
Ø расширение файла за счет внесения новых компонентов,
Ø полная замена содержимого записи,
Ø корректировка значений полей отдельных записей.
Все три вида одинаково применимы и к последовательным, и к произвольным файлам. Здесь рассмотрим технологию расширения файлов, корректировка записи в целом и отдельных полей будет описана ниже.
При расширении новые компоненты записываются сразу за последним компонентом корректируемого файла.
Расширение файла предполагает выполнение следующих шагов:
присвоить файлу имя (процедура Assign);
Ø открыть уже существующий на диске файл (процедура Reset);
Ø установить указатель файла за последним компонентом;
Ø подготовить информацию для нового компонента;
Ø записать новый компонент (оператор write);
Ø закрыть файл (процедура Close).
Для установки указателя за последним компонентом можно использовать следующую инструкцию:
Seek (FV, FileSize(FV));
которая значительно эффективнее и короче, чем поиск конца файла путем перебора всех существующих в файле компонентов.
Пример.
Расширить файл BIBL.DOC двумя новыми компонентами. Оформить блок корректировки процедурой с именем Kоrr. Сохранить текст на диске под именем РКоrr.
Procedure Rash;
begin
Assign(BooksFile,’ d: BIBL.DOC’);
Reset( BooksFile);
Seek( BooksFi le, FileSize(BooksFi le));
with RecBooks do
while True do
begin
writeln ('Введите номер');
readIn (Nomer);
if Nomer = 9999 then
begin
Close( BooksFile);
Exit
end;
writeln ('Введите имя автора');
readln (Avtor);
writeln ('Введите название книги');
readln (Nazv);
writeln ('Введите значение индекса');
readln (Index);
write ( BooksFi le, RecBooks)
end
end;
Объединив все процедуры в одной программе с помощью директивы компилятора $I, получим следующий текст:
Program DernoSF;
Type
Books = record
Nomer: integer;
Avtor: string[16];
Nazv: string[30];
Index : integer;
end;
Var
BooksFile: file of Books;
RecBooks: Books;
I,Rej : integer;
{$I d: PSOZD.PAS} { включение текста процедуры создания}
{$I d: POBR.PAS} {включение текста процедуры обработки}
{$1 d: PKORR. PAS} {включение текста процедуры расширения}
Begin
while True do
begin
ClrScr;
writeln ('Укажите режим:');
writeln (' 1: создание файла');
writeln (' 2: обработка файла');
writeIn (' 3: расширение файла’);
writeIn (' 4: выход из программы’ );
readln (Rej);
case Rej of
1: Org-;
2: Obr;
3: Rash;
4: Halt
else writeIn ('Ошибка! Повторите номер режима')
end
end
End.
Такая организация программы имеет недостаток: имя файла зафиксировано в программе. Чтобы его изменить, надо корректировать все инструкции, где это имя встречается. Поэтому в следующих примерах имя файла будем запрашивать у пользователя и вводить с клавиатуры.