Изменение реакции на ошибку
Реализация
Решение
Пример использования файлов
Задача. В текстовом файле f.txt записаны (вперемешку) целые числа: поровну отрицательных и положительных. Используя только один вспомогательный файл, переписать в текстовый файл h.txt все эти числа так, чтобы:
- порядок отрицательных чисел был сохранен;
- порядок положительных чисел был сохранен;
- любые два числа, стоящие рядом, имели разные знаки.
Если бы нам разрешили использовать два вспомогательных файла, мы бы просто переписали все положительные числа в один из них, а все отрицательные - в другой. А затем объединили бы два этих файла. В нашем же случае придется переписать во вспомогательный файл только положительные числа. Затем при "сборке" мы будем считывать из вспомогательного файла "все подряд", а из исходного - только отрицательные числа.
program z1;var f,g,h: text; k: integer;begin assign(f,'f.txt'); assign(g,'g.txt'); assign(h,'h.txt');{Переписываем положительные числа в доп.файл} reset(f); rewrite(g); while not eof(f) do begin read(f,k); if k>0 then write(g,k,' '); end;{Собираем числа в новый файл h.txt} reset(f); {Возвращаем указатель на начало файла f} reset(g); rewrite(h); while not eof(g) do begin read(g,k); write(h,k,' '); repeat read(f,k) until k<0; write(h,k,' '); end; close(f); close(g); close(h);end.По умолчанию любая ошибка ввода или вывода вызывает аварийную остановку работы программы. Однако существует возможность отключить такое строгое реагирование; в этом случае программа сможет либо игнорировать эти ошибки (что, правда, далеко не лучшим образом отразится на результатах ее работы), либо обрабатывать их при помощи системной функции IOResult: integer.
Директива компилятора5) {$I-} отключает режим проверки, соответственно директива {$I+} - включает.
Если при отключенной проверке правильности ввода-вывода ({$I-}) происходит ошибка, то все последующие операции ввода-вывода игнорируются - вплоть до первого обращения к функции IOResult. Ее вызов "очищает" внутренний показатель ("флаг") ошибки, после чего можно продолжать ввод или вывод.
Если функция IOResult возвращает 0, значит, операция ввода-вывода была завершена успешно. В противном случае функция вернет номер произошедшей ошибки.
Пример использования директив {$I}
flag:= false;write('Введите имя файла: ');repeat readln(s); {s:string}{$I-} assign(f,s); reset(f); case IOResult of 0: flag:= true; 3: write('Путь к файлу указан неверно. Измените путь: '); 5: write('Доступа к файлу нет. Измените имя файла: '); 152: write('Такого диска нет. Измените имя диска: '); else write('Такого файла нет. Измените имя файла: '); end; until flag;{$I+}Номер ошибки | Описание ошибки | Генерирующие процедуры6) | |||
2 | File not found | Файл не найден | append, erase, rename, reset, rewrite | ||
3 | Path not found | Директория не найдена | append, chdir, erase, mkdir, rename, reset, rewrite, rmdir | ||
4 | Too many open files | Открыто более 15 файлов одновременно | append, reset, rewrite | ||
5 | File access denied | Отказ в доступе к файлу | append, blockread, blockwrite, erase, mkdir, read, readln, rename, reset, rewrite, rmdir, write, writeln | ||
12 | Invalid file access code | Попытка использовать текстовый файл как типизированный или наоборот | append, reset | ||
16 | Cannot remove current directory | Невозможно удалить заданную директорию | rmdir | ||
100 | Disk read error | Попытка чтения после конца файла | read, readln | ||
101 | Disk write error | Ошибка записи на диск (диск полон) | close, write, writeln | ||
102 | File not assigned | Файл не назначен | append, erase, rename, reset, rewrite | ||
103 | File not open | Файл не открыт{бинарные файлы} | blockread, blockwrite, close, eof, filepos, filesize, read, seek, write | ||
104 | File not open for input | Файл не открыт для ввода {текстовые файлы} | eof, eoln, read, readln, seekeof, seekeoln | ||
105 | File not open for output | Файл не открыт для вывода {текстовые файлы} | write, writeln | ||
106 | Invalid numeric format | Неправильный числовой формат {текстовые файлы} | read, readln | ||
152 | Drive not ready | Задано неверное имя диска | append, erase, rename, reset, rewrite | ||
![]() | |||||
![]() | |||||
![]() | |||||
1) Напомним, что эти два устройства объединяются под общим наименованием "консоль".
2) См. лекцию 1.
3) См. лекцию 2.
4) Более правильно было бы сказать: "в файле, подключенном к файловой переменной f", однако для краткости здесь и далее мы будем использовать упрощенный вариант, полагая, что это не вызовет никаких недоразумений.
5) См. лекцию 1.
6) См. также лекцию 7.
7. Лекция: Записи. Бинарные файлы:
Использование таблиц с разнотипными полями. Работа с бинарными файлами.