Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Изменение реакции на ошибку

Реализация

Решение

Пример использования файлов

Задача. В текстовом файле f.txt записаны (вперемешку) целые числа: поровну отрицательных и положительных. Используя только один вспомогательный файл, переписать в текстовый файл h.txt все эти числа так, чтобы:

  1. порядок отрицательных чисел был сохранен;
  2. порядок положительных чисел был сохранен;
  3. любые два числа, стоящие рядом, имели разные знаки.

Если бы нам разрешили использовать два вспомогательных файла, мы бы просто переписали все положительные числа в один из них, а все отрицательные - в другой. А затем объединили бы два этих файла. В нашем же случае придется переписать во вспомогательный файл только положительные числа. Затем при "сборке" мы будем считывать из вспомогательного файла "все подряд", а из исходного - только отрицательные числа.

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. Лекция: Записи. Бинарные файлы:
Использование таблиц с разнотипными полями. Работа с бинарными файлами.

<== предыдущая лекция | следующая лекция ==>
Пробельные символы | Описание записей
Поделиться с друзьями:


Дата добавления: 2014-01-03; Просмотров: 222; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.