4. Файлы последовательного доступа, созданные пользователемРабота с файлом последовательного доступа предполагает его создание, обработку и корректировку. Для создания файла последовательного доступа необходимо: объявить файловую переменную; «привязать» файл к физическому носителю информации (присвоить файлу имя). (Assign); открыть новый файл (Rewrite); подготовить информацию для ввода в компоненту файла, т.е. сформировать запись для ввода в файл в качестве компоненты; записать в файл компоненту (Write); повторить п. 4, 5 необходимое количество раз; закрыть созданный файл (Close). Для доступа к компонентам последовательного файла (например, для просмотра содержимого файла на экране или для обработки компонент в целях включения их в качестве фрагментов в программу обработки каких-либо данных и т.п.) следует: присвоить файлу имя (Assign); открыть уже существующий файл (Reset); считать текущую компоненту из файла в рабочую область памяти (как правило, типа запись со структурой компоненты), (Read); выполнить обработку информации (например, вывести на экран поля записи); закрыть файл (Close). Возможны три типа корректировки файла как прямого, так и последовательного доступа: 1. Расширение файла за счет внесения новых компонент. 2. Полная замена содержимого компоненты. 3. Замена каких-либо полей отдельных компонент. Замена содержимого компонент отдельных записей или замена полей отдельных записей будет рассмотрена в следующем подразделе при изучении корректировки компонент файлов прямого доступа. Добавление новых записей в файл последовательного доступа выполняется путем записи компонент в конце файла. Маркер конца файла при этом переносится. Естественно, на физическом носителе при этом должно иметься свободное пространство. Для записи новых компонент в конце имеющегося файла необходимо: присвоить файлу имя (Assign); открыть уже существующий файл (Reset); установить указатель файла за последней компонентой (Seek (FV, File sise (FV)): создать в специально выделенной области памяти (как правило записи) новую компоненту; записать новую компоненту в файл (write); закрыть файл (Close). Пример. Организовать последовательный файл с именем PRIM bibl.dos в подкаталоге Prim каталога TURBO на диске С, т.е. C:\TURBO\bibl.dos. Компонента должна иметь структуру: индекс книги, порядковый номер экземпляра, фамилию, инициалы первых трех авторов (если их несколько), название книги. Блок создания файла оформить в виде процедуры с именем org. Блок доступа к компонентам файла оформить в виде процедуры с именем obr., а блок корректировки - в виде процедуры с именем Rash. Program Prim47; type books=record {базовая запись} nomer:integer; avtor:string[16]; nazv:string[30]; index:integer; end; var bf:file of books; {описать файловую переменную } rb:books; { участок памяти со структурой } { компоненты файла } procedure org; begin assign(bf,'C:\TURBO\PRIM\bibl.dos'); Rewrite(bf); with rb do { работать с записью rb без уточненных имен } while True do begin writeln('ввести номер книги'); readln(nomer); if nomer=9999 then {9999 - признак окончания ввода данных} Begin close(bf); Exit end; writeln('ввести имя автора'); readln(avtor); writeln('ввести название книги'); readln(nazv); writeln('ввести значение индекса'); readln(index); write(bf,rb); { записать компоненту из rb в файл } end; end; procedure Obr; Begin Assign(bf,'C:\TURBO\PRIM\bibl.dos'); Reset(bf); with rb do while not Eof(bf) do{ выйти из цикла, когда закончится файл } begin read(bf,rb); writeln(nomer:5,avtor:16,Nazv:10,index:6); { вывод на экран } end; Close(bf); end; procedure Rash; begin Assign(bf,'C:\TURBO\PRIM\bibl.dos'); Reset(bf); Seek(bf,Filesize(bf)); { установить указатель на конец файла } with rb do while True do begin writeln('ввести номер'); readln(nomer); if nomer=9999 then begin Close(bf);Exit end; writeln('ввести имя автора'); readln(avtor); writeln('ввести название книги'); readln(nazv); writeln('ввести значение индекса'); readln(index); write(bf,rb); end;end; BEGIN { основная программа } Org; Obr; Rash; Obr; readln; END. При создании больших программ их части удобно создавать в виде отдельных файлов (объектов), которые затем с помощью директивы компилятора {$i...} можно объединить в одну программу. Это удобно еще и тем, что несколько программистов могут создавать различные программы, что в несколько раз может ускорить процесс их создания. Создадим ту же программу, что и Prim 47, только пообъектно, тогда процедуру Org запишем в C:\TURBO\Org1.pas, процедуру Obr - в C:\TURBO\Orb1.pas, процедуру Rash - в C:\TURBO\Rash1.pas, а вызывающую (основную программу - в C:\TURBO\Prim. 48, в которой предусмотрим подключение объектов - процедур Org, Obr, Rash к основной программе через директивы компилятора $i. procedure Org1; begin assign(bf,'C:\TURBO\bibl.dos'); Rewrite(bf); with rb do while True do begin writeln('ввести номер книги'); readln(nomer); if nomer=9999 then begin close(bf); Exit; end; writeln('ввести имя автора'); readln(avtor); writeln('ввести название книги'); readln(nazv); writeln('ввести название индекса'); readln(index); write(bf,rb); end; end; procedure Obr1; begin Assign(bf,'C:\TURBO\bibl.dos'); Reset(bf); with rb do while not eof(bf) do Begin read(bf,rb); writeln(nomer:5,avtor:16,Nazv:10,index:6); end; Close(bf); writeln('нажмите enter'); readln; end; procedure Rash1; begin Assign(bf,'C:\TURBO\bibl.dos'); Reset(bf); Seek(bf,Filesize(bf)); with rb do while True do begin writeln('введите номер'); readln(nomer); if nomer=9999 then begin Close(bf);exit end; writeln('введите имя автора'); readln(avtor); writeln('введите название книги'); readln(nazv); writeln('введите значение индекса'); readln(index); write(bf,rb); end;end; Работу построим в режиме меню. Program Prim48; label M; type books=record nomer:integer; avtor:string[16]; nazv:string[30]; index:integer; end; Var bf:file of books; rb:books; regim:byte; {$i C:\TURBO\Org1.pas} {$i C:\TURBO\Obr1.pas} {$i C:\TURBO\Rash1.pas} BEGIN M: writeln('введите режим работы'); writeln('1 - создание, 2 - обработка', '3 - расширение, 4 - выход'); readln(regim); case regim of 1:Org1; 2:Obr1; 3:Rash1; 4:Exit; else writeln('неправильно задан режим'); end; goto M; END. Для обеспечения работы с различными именами файлов имя файла вначале запрашивается, а затем передается в процедуры. Таким образом, мы можем создавать несколько файлов, содержащих данные о книгах, их обрабатывать, расширять и т.п. Program Prim49; label M1,M2 ; type books=record nomer:integer; avtor:string[16]; nazv:string[30]; index:integer; end; Var bf:file of books; rb:books; regim:byte; si:char; fl:string; {$i C:\TURBO\Org.pas} {$i C:\TURBO\Obr.pas} {$i C:\TURBO\Rash.pas} BEGIN M1: writeln('где будет храниться файл? диск:\каталог\имя'), readln(fl); M2: writeln('введите режим работы'); writeln('1 - создание, 2 - обработка', '3 - расширение, 4 - выход'); readln(regim); case regim of 1:Org; 2:Obr; 3:Rash; 4:begin writeln('будем ещё работать с файлами? - "Y"'); writeln('или конец работы - любая клавиша'); readln(si); if (si='Y')or(si='y') then goto M1 else HALT; end; else begin writeln('неправильно задан режим'); goto M2; end; end; goto M2; END. Procedure Org2; begin assign(bf, fl); Rewrite(bf); with rb do while True do begin writeln('введите номер книги'); readln(nomer); if nomer=9999 then begin close(bf); Exit end; writeln('введите имя автора'); readln(avtor); writeln('введите название книги'); readln(nazv); writeln('введите значение индекса'); readln(index); write(bf,rb); end; end; Procedure Obr2; begin Assign(bf, fl); Reset(bf); with rb do while not Eof(bf) do begin read(bf, rb); writeln(nomer:5,avtor:16,Nazv:10,index:6); end; Close(bf); end; Procedure Rash2; begin assign(bf, fl); Reset(bf); Seek(bf,Filesize(bf)); with rb do while True do begin writeln('введите номер'); readln(nomer); if nomer=9999 then begin Close(bf);Exit end; writeln('введите имя автора'); readln(avtor); writeln('введите название книги'); readln(nazv); writeln('введите значение индекса'); readln(index); write(bf,rb); end;end; |