Подготовка файлов к работе

Поставив в соответствие внешнему файлу или устройству некоторую файловую переменную, перед выполнением собственно ввода или вывода информации эту переменную необходимо "открыть". Иными словами, требуется произвести подготовку к выполнению планируемых операций ввода-вывода. Такая подготовка осуществляется с помощью одной из трех процедур, Reset, Rewrite и Append, входящих в автоматически подключаемый стандартный модуль System. Выбор конкретной процедуры зависит от вида операции (чтение, запись, дозапись) и от типа используемого файла. Существующий файл открывается для считывания с помощью процедуры Reset, а для создания нового файла и подготовки его к записи применяется процедура Rewrite. Типизированные нетекстовые файлы всегда открываются с помощью процедур Rewrite и Reset, причем последняя делает файл доступным не только для считывания, но также для записи или дозаписи. Если же необходимо дозаписывать текстовый файл, его следует открывать с использованием процедуры Append.

Рассмотрим некоторые детали применения этих трех процедур, осуществляющих подготовку файлов и устройств к работе. Вызов процедуры Reset имеет следующий формат:

Reset(< имя >[,< длина записи >]);

Здесь и далее аргумент < имя > задает имя файловой переменной. Аргумент <длина записи > используется (но не обязателен) только при открытии нетипизированных файлов. Это выражение типа Word, указывающее длину передаваемых записей, которая по умолчанию задается равной 128 байтам. В результате выполнения процедуры Reset производятся все действия, необходимые для подготовки к передаче данных из файла или устройства в память. В частности резервируется буферная область и специальный указатель устанавливается на начало файла, т.е. на запись с нулевым номером. Кроме того, проверяется наличие файла, связанного с указанной при вызове Reset переменной. Если этого файла не существует, программа останавливается и на экран выдается сообщение об ошибке.

Режим проверки наличия файла устанавливается по умолчанию или принудительно по директиве компилятора {$I+}, включающей средства контроля ошибок ввода-вывода. Чтобы избежать аварийной остановки программы при отсутствии требуемого файла, можно отключить режим автоматического контроля ошибок, задав директиву {$I-}. В этом случае также можно выяснить, имеется ли файл, воспользовавшись стандартной функцией IOResult. Функция IOResult возвращает при вызове величину типа Word, характеризующую состояние последней выполненной перед IOResult операции ввода-вывода, обращения к файлам или устройствам. Если эта операция завершилась успешно, значение IOResult равно нулю. Если же операция проходила с теми или иными отклонениями, возвращается ненулевое значение.

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

Program p14_2;

Var

MyFile: File of Real;

Begin

Assign(MyFile,'d:\TP\Data.dat');

{$I-} {Блокировка контроля ошибок}

Reset(MyFile);

{$I+} {Включение контроля ошибок}

If IOResult = 0 Then

WriteLn('Файл подготовлен к работе');

Else

WriteLn('Неверно задано имя файла');

End.

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

Rewrite(< имя > [, < длина записи > ] >);

Аргументы здесь имеют тот же смысл, что и при вызове процедуры Reset. В результате выполнения Rewrite создастся новый файл, резервируется буферная область и указатель файла устанавливается на его начало, т.е. на запись с нулевым номером. Если к моменту вызова Rewrite файл, связанный с заданной файловой переменной, уже был создан, он помечается как уничтоженный, создается (под прежним именем) вновь и обычным порядком подготавливается к записи информации. Учитывая, что обращение с целью записи к существующему файлу не квалифицируется как ошибка и поэтому никаких сообщений система не выдает, пользоваться процедурой Rewrite следует с особым вниманием.

Файлы, объявленные в программе как текстовые, можно расширять, добавляя новые записи-строки вслед за последней записью файла. К этой операции файл подготавливается с помощью процедуры Append, вызов которой имеет следующий формат:

Арреnd(<имя>);

В результате выполнения Append ранее созданный файл открывается для приема информации, как обычно резервируется буферная область, но указатель файла устанавливается не на его начало, а переводится в конец, вслед за записью со старшим номером. При выводе информации в текстовые файлы можно всегда открывать их процедурой Append, используя ее и для работы с новыми файлами вместо Reset. Если заданный файл не существует, Append создает его заново и, поскольку записи в нем отсутствуют, устанавливает указатель на его начало, т.е. делает в этом случае то же самое, что и Reset. При нормальном окончании программы автоматически выполняются некоторые операции, необходимые для завершения работы со всеми открытыми в программе файлами: производится физическая запись оставшихся во внутреннем буфере файла данных, в каталогах фиксируются вновь созданные файлы и т.д. Эти же операции можно и более того рекомендуется осуществлять сразу же по завершении работы с каждым файлом, не дожидаясь конца программы. Для этого применяется стандартная процедура Close, вызов которой имеет формат

Close(< имя >);

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: