Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные на Pasca (Кудрявцев)l

.pdf
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
1.63 Mб
Скачать

Файлы

143

 

 

Спецификация файла. Имя файла состоит из собственно имени (1– 8 символов: букв и цифр) и необязательного типа файла (3 симво- ла). Тип файла присваивается обычно в мнемонической зависимо- сти от содержания файла. Например, programm.pas, programm.bas, pascal.doc, instruct.txt.

Стандартные процедуры и функции обработки файлов. При их описании используем следующие обозначения: FV файловая пе- ременная; Str строковое выражение; P переменные p1, p2, ...,pn того же типа, что и компоненты переменной FV; n целочисленное выражение.

Процедуры. Осуществляют все необходимые действия по органи- зации файлов и доступу к компонентам файлов.

Assign(FV, Str) связывает файловую переменную FV с именем файла Str. С момента выполнения этой процедуры все действия над переменой FV будут эквивалентны действиям над файлом, опреде- ляемым значением Str.

Rewrite(FV) создать новый файл на диске. Имя файла предвари- тельно определяется в процедуре Assign. Указатель файла устанав- ливается на первую позицию (с номером 0), файл подготовлен для загрузки.

Reset(FV) установить указатель в начало файла. Эта процедура, примененная к несуществующему файлу, вызывает ошибку вводавывода.

Read(FV, P) читать из файла FV значения переменных p1,p2,..,pn. После выполнения процедуры указатель перемещается на следую- щий компонент.

Write(FV, P) записать в файл. Переменные p1,...,pn записываются в дисковый файл, определенный переменной FV, и указатель пере- мещается к следующему компоненту.

Seek(FV, n) установить указатель на компонент с порядковым но- мером n в файле. Счет начинается с нуля, т. е. первый компонент имеет номер 0, второй – 1 и т.д.

Flush(FV) очистить буфер сектора. Выполнение процедуры вызы- вает выталкивание внутреннего буфера в файл, если ранее выпол-

144

Лабораторная работа № 13

 

 

нялись операции записи. К закрытому файлу процедура не приме- няется. Файл текстовый.

Close(FV) закрыть файл. Если файл был открыт, никогда не сле- дует выходить из программы, предварительно не закрыв его.

Erase(FV) уничтожить файл. Для уничтожения открытого файла, его предварительно закрывают процедурой Close.

Rename(FV, Str) переименовать файл. Его новое имя дается пере- менной Str.

Truncate(FV) уничтожить все компоненты файла, начиная с места текущего положения указателя, и подготовить файл для записи.

Функции. Выполняют дополнительные действия, облегчающие программисту обслуживание уже существующих файлов.

Eof(FV) проверить маркер конец файла”. Значение функции рав- но True, если указатель файла находится сразу за последним ком- понентом файла, и False в любом другом случае.

FileSize(FV) определить длину файла. Функция возвращает цело- численное значение, равное количеству компонентов файла. Размер файла берется из директория. Функция используется для того, что- бы проверить, содержит файл информацию или является пустым.

IOResult(FV) проверка результата выполнения последней опера- ции на наличие ошибок. Функция возвращает номер ошибки, если она обнаружена, и 0 – если ошибок нет.

СТАНДАРТНЫЕ ФАЙЛЫ

В языке Pascal все внешние устройства трактуются как логические устройства, которым соответствуют заранее определенные (стан- дартные) файлы. Эти файлы фактически являются драйверами, обеспечивающими операции вводавывода между процессором и конкретными физическими устройствами. Используются следую- щие логические устройства:

Con: – (консоль) пульт управления. Для ввода это клавиатура, для вывода дисплей. Вводимая информация отображается и может редактироваться. Непосредственно ввод осуществляется нажатием клавиши Ввод”.

Файлы

145

 

 

Prn: логическое имя принтера. Aux: вспомогательное устройство.

Nul: логическое имя пустого устройства”.

Для организации работы с логическими устройствами исполь- зуются стандартные файлы. Система сама открывает и закрывает эти файлы, поэтому к ним не применяются процедуры Assign, Flush, Reset, Rewrite. В системе имена логических устройств и соответст- вующих им стандартных файлов, за исключением основных файлов вводавывода, совпадают:

Input основной файл для ввода. Назначается устройству Con. Output основной файл для вывода. Назначается устройству Con.

Con назначается устройству Con, Aux назначается устройству Aux, Nul назначается устройству Nul, Prn назначается устройству

Prn.

ФАЙЛЫ ПОСЛЕДОВАТЕЛЬНОГОДОСТУПА

Используются для решения задач, требующих поочередной обра- ботки компонент файла. Работа с последовательными файлами предполагает создание файла, его обработку и корректировку. Для создания последовательного файла необходимо выполнить сле- дующие шаги:

1) связать имя файла с файловой переменной (процедура

Assign);

2)открыть новый файл (процедура Rewrite);

3)подготовитьинформацию для ввода;

4)записать в файл компоненты (процедура Write);

5)закрыть созданный файл (процедура Close).

Пример. Организовать последовательный файл с именем BIBL.DOC на дисководе А. Структура записи следующая: порядко- вый номер книги; автор книги; название книги; индекс книги. Блок организации оформить процедурой с именем Org. Значения полей ввести с клавиатуры. Признак окончания ввода число 99 в облас- ти номера.

Program Posled_File; Type Books = Record

146

Лабораторная работа № 13

 

 

Nomer: integer; Avtor: string[16]; Nazv: string[30]; Index: integer;

End;

Var BooksFile: File of Books;

RecBooks: Books; I,Rej: integer;

Procedure Org;

{ Выход из процедуры ответ 99 для поля Nomer } begin

Assign(BooksFile, 'A:BIBL.DOC'); Rewrite(BooksFile);

with RecBooks do while True do

begin

writeln('Введите номер книги'); readln(Nomer);

if Nomer = 99 then begin Close(BooksFile); Exit end; writeln('Введите имя автора'); readln(Avtor); writeln(' Введите название книги'); readln(Nazv); writeln(' Введите значение индекса'); read(Index); write(BooksFile, RecBooks)

end;

end;

.......................

Доступ к компонентам последовательного файла. Чтобы обработать хранящиеся в файле данные, необходимо получить доступ к ком- понентам файла. Для этого надо: 1) связать имя файла с файловой переменной (процедура Assign); 2) открыть уже существующий на диске файл (процедура Reset); 3) последовательно считать компо- ненты до нужного (процедура Read); 4) выполнить обработку; 5) закрыть файл (процедура Close).

Пример.

Вывести на экран содержание всех записей файла. Блок вывода оформить процедурой с именем Obr.

Procedure Obr;

begin

Assign(BooksFile, 'A:BIBL.DOC');

Reset(BooksFile);

with RecBooks do

Файлы

147

 

 

while not Eof(BooksFile) do begin

read(BooksFile, RecBooks); writeln(Nomer:1, Avtor:16, Nazv:30, Index:6)

end;

Close(BooksFile)

end;

Корректировка последовательного файла. Возможны три вида кор- ректировки: расширение файла внесением дополнений, полная за- мена содержимого записи, корректировка значений полей отдель- ных записей. Все три вида одинаково применимы и к последова- тельным, и к произвольным файлам.

Рассмотрим технологию расширения файлов. Новые компоненты

записываются сразу за последним компонентом корректируемого файла. Расширение файла предполагает следующие шаги: 1) свя- зать имя файла с файловой переменной (процедура Assign); 2) от- крыть уже существующий на диске файл (процедура Reset); 3) ус- тановить указатель файла за последним компонентом; 4) подгото- вить информацию для нового компонента; 5) записать новый ком- понент (процедура Write); 6) закрыть файл (процедура Close).

Для установки указателя за последним компонентом можно ис- пользовать следующую инструкцию: Seek(FV, FileSize(FV)); которая значительно эффективнее и короче, чем поиск конца файла путем перебора всех существующих в файле компонентов.

Пример.

Расширить файл BIBL.DOC двумя новыми компонентами. Оформить блок корректировки процедурой с именем Korr.

Procedure Korr; begin

Assign(BooksFile, 'A:BIBL.DOC'); Reset(BooksFile);

Seek(BooksFile, FileSize(BooksFile)); with RecBooks do

while true do begin writeln('Введите номер'); readln(Nomer);

if Nomer = 99 then begin

Close(BooksFile);

148

Лабораторная работа № 13

 

 

Exit end;

writeln(' Введите имя автора'); readln(Avtor);

writeln(' Введите название книги'); readln(Nazv);

writeln(' Введите значение индекса'); readln(Index);

write(BooksFile, RecBooks); end

end;

Объединив все процедуры, получим следующую программу:

Program Posled_File; Uses Crt;

Type Books = Record

Nomer: integer; Avtor: string[16]; Nazv: string[30]; Index: integer;

End;

Var BooksFile: File of Books;

RecBooks: Books; I,Rej: integer;

Procedure Org; {описание процедур} <.........>;

Procedure Obr; <.........>; Procedure Korr; <.........>;

Begin

while True do begin

writeln('Укажите режимы: '); writeln(' 1: Создание файла '); writeln(' 2: Обработка файла '); writeln(' 3: Расширение файла '); writeln(' 4: Выход из программы '); readln(Rej);

case Rej of

1:Org;

2:Obr;

Файлы

149

 

 

3:Korr;

4:Halt

else writeln ('Повторите ввод') end

end End.

ФАЙЛЫ ПРОИЗВОЛЬНОГО ДОСТУПА

Организация файла произвольного доступа. Создаются для реше- ния задач, требующих оперативного доступа к хранимой информа-

ции или при наличии зависимости значения поля компонента от порядкового номера компонента в файле. Работа с таким файлом предполагает его организацию, обработку и корректировку. Орга- низовать файл произвольного доступа можно двумя способами: 1)

создать последовательный файл и обращаться к компонентам по их порядковому номеру, трактуя последовательный файл как произ- вольный; 2) создать файл фиктивных записей (например, пробелов или нулей; это т.н. форматизация файла), затем загрузить его по ключу фактическими данными; обращение к компонентам по клю- чу предполагает использование процедуры Seek. Рассмотрим 2–й способ.

Пример.

Форматизовать файл произвольного доступа из 10 записей. Формат компонентов такой же, как и в предыдущем примере. Оформить блок как процедуру с именем Form.

Program Proizv_File; Const Razmer = 10; Type Books = Record

Nomer: integer; Avtor: string[14]; Nazv: string[30]; Index: integer

End;

Var BooksFile: File of Books; RecBooks: Books; k,K1: integer; i,Rej: integer; FileName: string[12];

Procedure Form; begin

writeln(' Введите имя форматируемого файла');

150

Лабораторная работа № 13

 

 

readln(FileName); Assign(BooksFile, FileName); Rewrite(BooksFile);

with RecBooks do begin

for i:=1 to Razmer do begin

Nomer:= 0; { если нужно, при форматизации сразу в запись заносится значение номера 1 .. i,

можно записать Nomer:= i;}

Avtor:= ' '; Nazv:= ' '; Index:= 0; write(BooksFile, RecBooks);

end

end;

writeln('Форматизация ', Razmer,' записей выполнено'); Close(BooksFile)

end;

После форматизации файла можно приступить к его загрузке по ключу фактической информацией, которая заменит фиктивную.

Пример.

Внести в файл BIBL2.DOC фактические записи с номерами 3, 7, 8. Оформить блок загрузки процедурой с именем ZagrKl.

Procedure ZagrKl; begin

writeln(' Введите имя загружаемого по ключу файла'); readln(FileName);

Assign(BooksFile, FileName); Reset(BooksFile);

writeln('Сколько записей будете вводить?'); readln(k);

with RecBooks do for i:= 1 to k do

begin

writeln(' Введите номер '); readln(Nomer); K1:= Nomer; writeln(' Введите имя автора '); readln(Avtor);

writeln(' Введите название книги '); readln(Nazv);

writeln(' Введите индекс '); readln(Index); Seek(BooksFile,K1–1);

write(BooksFile, RecBooks); end;

Файлы

151

 

 

Close(BooksFile);

end;

Доступ к компонентам файла. Может быть как последовательным, так и произвольным. Последовательный уже описан. Для организа- ции произвольного доступа используется процедура Seek. Произ- вольный доступ организовывается по ключу, значение которого равно порядковому номеру в файле нужного элемента. Ключ дол- жен быть целочисленным, не превышающим количество компонен- тов в файле. Порядок действий при обработке файлов произвольно- го доступа следующий: 1) связать имя файла с файловой перемен- ной (процедура Assign); 2) открыть файл (процедура Reset) и запро- сить ключ; 3) подвести указатель по ключу к нужному компоненту (процедура Seek); 4) считать нужный компонент (процедура Read); 5) выполнить обработку считанной информации; 6) закрыть файл (процедура Close).

Пример. Вывести на экран 6–й и 7–й компоненты файла BIBL2.DOC. Блок вывода оформить процедурой с именем ObrKl.

Procedure ObrKl; begin

writeln(' Введите имя файла:'); readln(FileName); Assign(BooksFile, FileName);

Reset(BooksFile); while True do

begin

writeln('Дайте ключ выводимой записи:'); readln(K1); if K1 = 99 then begin Close(BooksFile); Exit end; Seek(BooksFile, K1–1);

read(BooksFile, RecBooks); with RecBooks do

writeln(Nomer:4, Avtor:16, Nazv:15, Index:4);

end

end;

Корректировка файла произвольного доступа. Заключается в из-

менении значений полей компонентов в целом (или частично) или расширении файла. Для корректировки полей компонентов файла необходимо: 1) связать имя файла с файловой переменной (проце- дура Assign); 2) открыть корректируемый файл (процедура Reset); 3) подвести указатель файла к корректируемому компоненту

152

Лабораторная работа № 13

 

 

(Seek); 4) считать корректируемый компонент (процедура Read); 5) откорректировать нужные поля; 6) повторить инструкцию подвода указателя (процедура Seek); 7) записать откорректированный ком- понент (процедура Write); 8) закрыть файл (процедура Close).

Пример.

Откорректировать «название книги» и «индекс книги» в рассмот- ренных выше примерах. Блок вывода оформить процедурой с име-

нем KorrKl.

Procedure KorrKl;

Var NewAvtor: string[16]; NewNazv: string[30]; NewIndex: integer;

begin

Write(' Введите имя файла:'); readln(FileName); Assign(BooksFile, FileName);

Reset(BooksFile); with RecBooks do

begin

Write('Сколько записей будете корректировать? '); Readln(k);

for i:=1 to k do begin

Write('Номер корректируемой записи:'); Readln(K1); Write('Название книги: '); Readln(NewNazv); Write('Индекс: '); Readln(NewIndex); Seek(BooksFile, K1–1);

Read(BooksFile, RecBooks); Avtor:= NewAvtor;

Nazv:= NewNazv;

Index:= NewIndex; Seek(BooksFile, K1–1); Write(BooksFile, RecBooks); end;

end;

Close(BooksFile)

end;

Процедура корректировки полной записи аналогична описанной ранее (см. корректировка последовательного файла), только новая запись вносится на место уже существующей, а не фиктивной. Же- лательно при создании файла спроектировать файл такого размера, чтобы его по возможности не расширять.