Содержание
Пример использования файлов
Задача. В текстовом файле f.txt записаны (вперемешку) целые числа: поровну отрицательных и положительных. Используя только один вспомогательный файл, переписать в текстовый файл h.txt все эти числа так, чтобы:
- порядок отрицательных чисел был сохранён;
- порядок положительных чисел был сохранён;
- любые два числа, стоящие рядом, имели разные знаки.
Решение
Если бы нам разрешили использовать два вспомогательных файла, мы бы просто переписали все положительные числа в один из них, а все отрицательные — в другой. А затем объединили бы два этих файла. В нашем же случае придётся переписать во вспомогательный файл только положительные числа. Затем при «сборке» мы будем считывать из вспомогательного файла «всё подряд», а из исходного — только отрицательные числа.
Реализация
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}
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+}
Номер ошибки | Описание ошибки | Генерирующие процедуры2 | |
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 | Открыто слишком много файлов одновременно | 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 |