Задача. В текстовом файле 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.
Директива компилятора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('Такого файла нет. Измените имя файла: ');