Ввод и вывод информации: текстовые файлы
Пример использования файлов
Задача. В текстовом файле 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См. лекцию 1. {$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+}