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

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

.pdf
Скачиваний:
40
Добавлен:
18.03.2015
Размер:
2 Мб
Скачать
☆

Файлы

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;

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