| Assign( f, 'NoFile.TXT' );
| {$I-} { выключение проверки ввода-вывода }
| Reset( f ); { попытка открыть файл f }
| {$I+} { восстановление проверки }
| if IOResult<>0 { Если файл не может быть открыт, }
| then { то дать сообщение: }
| WriteLn( 'Файл не найден или не читается' )
| else begin { Иначе (код равен 0) все хорошо }
| Read( f, ... ); { и можно нормально работать с }
| ... { файлом f... }
| Close(f)
| end; {else и if}
Рис. 12.10
В случае неудачи при открытии файла к нему не надо применять процедуру закрытия Close.
По тому же принципу можно построить функцию анализа существования файла (рис. 12.11).
| FUNCTION FileExists( FileName : String ) : Boolean;
| VAR
| f : File; { тип файла не важен }
| BEGIN
| Assign( f, FileName ); { связывание файла f }
| {$I-} Reset( f ); {$I+} { открытие без контроля }
| if IOResult=0 { Если файл существует, }
| then begin { то его надо закрыть }
| Close{ f );
| FileExists := True end {then}
| else { иначе просто дать знать}
| FileExists := False;
| END;
Рис. 12.11
2. Выбор режима дозаписи в текстовый файл или его создания. Механизм остается тот же (рис. 12.12). Здесь f — текст-файловая переменная.
- 264 -
| Assign(f,'XFile.TXT'); {связывание файла f }
| {$I-} Append( f ); {$I+} {попытка открыть его для дозаписи}
| if IOResult<>0 {Если файл не может быть открыт, }
| then Rewrite( f ); {то создать его. }
| ...
| Write( f, ...); { нормальная работа с файлом }
| ...
| Close( f );
Рис. 12.12
3. Переход в заданный каталог или его создание, если переход возможен (рис. 12.13, S — строковая переменная).
| S := 'C:\NEWDIR'; { задано имя каталога }
| {$I-} ChDir( S ); {$I+} { попытка перейти в него }
| if IOResult<>0 { Если не получается, }
| then begin
| MkDir( S ); {то сначала создать его, }
| ChDir( S ) { а уж потом перейти. }
| end; {if}
| { Подразумевается, что каталог S в принципе создаваем. }
Рис. 12.13
4. Построение «умных» ждущих процедур чтения данных с клавиатуры. Такие процедуры не будут реагировать на данные не своего формата (рис. 12.14).
| { Здесь используется ряд процедур из библиотеки }
| CRT; { модуля CRT. Они отмечены * в комментариях. }
{Процедура считывает с клавиатуры значение типа Integer, помещая его в переменную V. При этом игнорируется любой ввод, не соответствующий этому типу. X и Y — координаты текста запроса Comment. Проверка корректности значений X и Y не производится. }
PROCEDURE ReadInteger( X,Y : Byte; Comment : String;
| VAR V : Integer );
Рис. 12.14
- 265 -
| CONST
| zone =12; { ширина окна зоны ввода числа }
| VAR
| WN.WX : Word; {переменные для хранения размеров окна }
| BEGIN
| WN:=WindMin; WX:=WindMax; {Сохранение текущего окна }
| {$I-} { отключение режима проверки }
| GotoXY( X,Y ); {*перевод курсора в X,Y }
| Write( Comment ); { печать комментария ввода }
| Inc(X, Length(Comment)); { увеличение координаты X }
| Window( X,Y, X+zone,Y ); {*определение окна на экране }
| Repeat { Главный цикл ввода числа: }
| ClrScr; {* очистка окна ввода, }
| ReadLn( V ); { считывание значения при $I- }
| until (IOResult=0); { пока не введено целое }
| {$I+} { включение режима проверки }
| {*восстановление окна: }