Сообщение об ошибке времени выполнения появится и в разделе Список ошибок" окна PascalABC.NET:
Создание пустого результирующего файла
Для того чтобы избежать ошибки времени выполнения, отсутствующий файл результатов следует открыть не процедурой Reset, а процедурой Rewrite, которая и обеспечит создание этого файла. Далее, после завершения работы с файлами, открытыми в программе, их необходимо закрыть процедурой Close. Добавим в программу соответствующие операторы:
usesPT4;
var
i: integer;
s: string;
f: array[1..4] of file ofinteger;
begin
Task('File48');
fori := 1 to4 do
begin
read(s);
Assign(f[i], s);
ifi < 4 thenReset(f[i])
elseRewrite(f[i]);
end;
{ * }
fori := 1 to4 do
Close(f[i]);
end.
Комментарий { * } расположен в том месте программы, в котором можно выполнять операции ввода-вывода для всех четырех файлов: они уже открыты процедурами Reset или Rewrite и еще не закрыты процедурой Close.
Запуск этого варианта программы не приведет к ошибке времени выполнения; более того, результирующий файл будет создан. Однако созданный файл останется пустым, то есть не содержащим ни одного элемента. Поэтому при запуске программы на информационной панели появится сообщение Ошибочное решени е ", а в строке, которая должна содержать элементы результирующего файла, появится текст EOF: (особое значение EOF для указателя текущей файловой позиции означает, что данный файл существует, но не содержит ни одного элемента):
Пример программы, использующей неправильные типы для файловых данных
Во всех ранее рассмотренных вариантах программы мы не использовали операции ввода-вывода для файлов. Поэтому тип файлов не играл никакой роли: вместо типа file ofinteger мы могли использовать любой другой файловый тип, например, file ofreal, и результат выполнения программы был бы тем же самым.
Тип файловых элементов становится принципиально важным, если в программе используются операции ввода-вывода для данного файла. Чтобы продемонстрировать это на примере нашей программы, внесем в нее следующие изменения: в описании массива f файловых переменных тип integer заменим на real, в раздел описаний добавим описание переменной a типа real, в раздел операторов (в позицию, помеченную комментарием { * }) добавим следующий фрагмент:
fori := 1 to3 do
begin
read(f[i], a);
write(f[4], a);
end;
Данный фрагмент обеспечивает считывание одного элемента для каждого из трех исходных файлов и запись этих элементов в результирующий файл (в требуемом порядке). Подчеркнем, что мы неправильно указали типы файлов; тем не менее, компиляция программы пройдет успешно, а после ее запуска не произойдет ошибок времени выполнения.
Результат работы программы будет неожиданным:
Судя по экранной строке с содержимым результирующего файла, в него будут записаны не три, а шесть элементов , по два начальных элемента из каждого исходного файла. Объясняется это тем, что после связывания файлов с файловыми переменными типа file ofreal элементами файлов стали считаться вещественные числа (занимающие в памяти по 8 байтов), тогда как на самом деле", то есть по условию задания, элементами файлов являются целые числа (занимающие в памяти по 4 байта). Поэтому считывание из файла и последующая запись в файл одного "вещественного элемента" фактически приводит к считыванию и записи блока данных размером 8 байтов, содержащего два последовательных целочисленных элемента исходного файла.
Итак, мы выяснили, что ошибки, связанные с несоответствием типов файлов, не выявляются при компиляции и не всегда приводят к ошибкам времени выполнения. Это следует иметь в виду, и при появлении странных" результирующих данных начинать поиск ошибки с проверки типов файловых переменных.
Читать дальше