Наиболее часто ошибки возникают при работе с файлами на внешних устройствах. Может произойти сбой записи на дискету, нерадивый пользователь норовит забыть вставить дискету в дисковод, другой любит класть диски в CD ROM не той стороной и т.д. В результате, если не принять особых мер, будут происходить фатальные ошибки и вся программа позорно "свалится" из-за такой мелочи, как ошибка записи или считывания файла.
Существует несколько способов решения указанной проблемы. Во-первых, надо сообщить транслятору, что в данном месте программы надо реагировать на ошибки ввода-вывода спокойнее, а точнее говоря, вовсе их не замечать. Указания транслятору даются при помощи так называемых директив.
Директива – особый объект в тексте программы, управляющий режимами компиляции программы. На Паскале директивы записываются в фигурных скобках, причем сразу после открывающей скобки идет знак доллара, а за ним – имя директивы и, если необходимо, дополнительные параметры.
За ввод-вывод отвечает директива I.
{$I-} – отключить контроль ввода-вывода;
{$I+} – включить контроль ввода-вывода.
Таким образом, чтобы обезопасить процедуру записи информации в файл, следует написать:
{$I-}
Writeln(f,s);
{$I+}
Теперь программа не будет реагировать на сбой при записи. Но как же узнать, не случилось что-то страшное, раз контроль отключен? Для этого есть функция IORESULT, которая возвращает код результата выполнения последней операции ввода-вывода. Если это 0 – все нормально, иначе – ошибка. После вызова функции ее значение сбрасывается, поэтому обычно его сохраняют в переменную. Проверка выглядит следующим образом:
{$I-}
Writeln(f,s);
IF IOResult<>0 THEN
WriteLn(’Ошибка записи’)
{$I+}