| >ClrScr; {* очистка окна ввода, }
| >ReadLn( V ); { считывание значения при $I- }
| >until (IOResult=0); { пока не введено целое }
| >{$I+} { включение режима проверки }
| >{*восстановление окна: }
| >Window( Lo(WN)+1, Hi(WN)+1, Lo(WX)+1, Hi(WX)+1 )
| >END; {proc}
| >VAR i : Integer; { === ПРИМЕР ВЫЗОВА ПРОЦЕДУРЫ === }
| BEGIN
| >ClrScr; {* очистка экрана }
| >ReadInteger(10,10,'Введите целое число: ',i); { вызов }
| >WriteLn; WriteLn( 'Введено i=', i ); { контроль }
| >ReadLn { пауза до нажатия ввода}
| END.
Рис 12.14 (окончание)
В примере можно попутно устроить проверку диапазона значений V, переписав условие окончания цикла в виде
until (IOResult=0) and (VVmin);
где Vmax и Vmin — границы воспринимаемых значений V. Аналогичным способом, меняя лишь типы переменной V, можно определить процедуры ReadByte, ReadWord, ReadReal и т.п. Справедливости ради надо отметить, что хотя описанная процедура ReadInteger спокойно относится к попыткам впихнуть в нее буквы, дроби и прочие неподходящие символы, она чувствительна к превышению диапазона значений типа Integer во входном числе и не обрабатывает его.
5. Работа с текстовыми файлами данных произвольного формата. Пусть существует файл из N столбцов цифр, содержащий в некоторых строках словесные комментарии вме-
- 266 -
сто числовых значений. На рис. 12.15 показано, как можно прочитать из файла все цифровые данные, игнорируя строки-комментарии, текстовые строки или строки пробелов (а так же пустые).
| >CONST N=3; { пусть в файле данные даны в трех столбцах }
| VAR
| >f : Text; { текст-файловая переменная }
| >i : Byte; { счетчик }
| >D : Array [1..N] of Real; { значения одной строки }
| >{ данных в формате Real }
| BEGIN
| >Assign(f,'EXAMPLE.DAT'); { связывание файла f }
| >Reset( f ); { открытие файла для чтения }
| >{$I-} { отключение режима проверки }
| >while not SeekEOF(f) do { Цикл до конца файла: }
| >begin
| >Read( f, D[1] ); { попытка считать 1-е число }
| >if IOResult=0 { Если это удалось,то затем }
| >then begin { читаются остальные числа: }
| >for i:=2 to N do Read( f, D[i] );
| >{ и как-либо обрабатываются: }
| >WriteLn( D[1]:9:2, D[2]:9:2, D[3]:9:2 )
| >end; {if 10...}
| >ReadLn( f ) { переход на следующую строку }
| >end; {while} { конец основного цикла }
| >{$I+} { включение режима проверки }
| >Close( f ); { закрытие файла f }
| >ReadLn { пауза до нажатия ввода }
| END.
Рис. 12.15
По тому же принципу можно построить обработку ошибок позиционирования при прямом доступе в файлы и прочих задач, связанных с вводом-выводом.
Обращаем внимание на то, что во всех примерах подразумевается общий режим компиляции {$I+}, который в них всегда восстанавливается после завершения операции ввода-вывода. Советуем компилировать программы и модули в режиме {$I+}, используя его отключение только там, где действительно нужно обработать ошибку.