Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прогр.на_ЯВУ_уч.пос.DOC
Скачиваний:
24
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Перемещения по файлу

Это группа дополнительных процедур и функций, позволяющая изменять последовательный порядок операций чтения и записи. Единственным исключением является базовая логическая функция EOF, указывающая на конец файла:

EOF (< имя_файловой_переменной >)

При чтении, если все данные прочитаны, возникает ситуация «конец файла», и эта функция принимает значение True, иначе она равна False. Так как при записи данные всегда добавляются в конец файла, то функция имеет постоянное значение True.

Процедура

SEEK (< имя_файловой_переменной >,<выражение>);

позволяет явно изменять значение указателя файла, устанавливая его на компонент файла с номером, заданным выражением. Здесь выражение должно быть целого типа Longint.

Эту процедуру можно применять не только для произвольного чтения элементов файла, но и для его усечения. Если затем использовать процедуру

TRUNCATE (< имя_файловой_переменной >);

то компоненты файла, следующие за текущем указателем включительно, будут удалены.

При использовании процедуры Seek может возникнуть ситуация, когда компонентов в файле меньше, чем указанное значение, и может возникнуть аварийная ситуация. Чтобы этого избежать, используют функции

FileSize (< имя_файловой_переменной >)

FilePos (< имя_файловой_переменной >)

Они позволяют получить дополнительную информацию о файле и возвращают: первая – общее число элементов в файле, вторая – номер элемента, на который установлен указатель файла.

Пример работы с файлом

В качестве примера приведем статистическую обработку информации, находящейся в файле из текущего раздела, имя которого вводится с клавиатуры, а расширение .DAT назначено по умолчанию. В программе вычисляются математическое ожидание и дисперсия вещественных чисел соответственно по формулам:

и .

Program Statistic;

Var

Fil:File of real; { входной файл }

x, { очередное вводимое число }

M,D: real; { матожидание и дисперсия }

N: integer; { количество введенных значений }

Name: string; { вводимое имя файла (без расширения) }

Begin

N:=0; M:=0; D:=0;

Read(Name); { вводим имя файла }

{ ставим в соответствие внутреннее и внешнее имена }

Assign(Fil,Name+'.dat');

Reset(Fil); { открываем файл для чтения}

While not Eof(Fil) do Begin

N:=N+1;

Read(Fil,x); { в цикле вводим все значения }

M:=M+x; { и суммируем их }

D:=D+x*x;

end;

M:=M/N;

D:=sqrt(D/N-M*M);

Writeln(' Матожидание= ',M:10:5,' Дисперсия= ', D:10:5);

end.

При попытке открыть несуществующий файл может возникнуть аварийная ситуация, поэтому необходимо проверять корректность операций.

Обработка ошибок ввода-вывода

При выполнении программы, написанной на языке Турбо Паскаль, установлены следующие правила обработки ошибочных ситуаций, связанных с вводом и выводом. По умолчанию при выполнении любой такой операции автоматически производится проверка на возникновение ошибки. При обнаружении ошибки выполнение программы прекращается, на экран выводится диагностическое сообщение с условным номером ошибки.

Можно предусмотреть в самой программе реакцию на ошибочные ситуации. Для этого используется директива компилятора {$I-}. В этом случае возникновение ошибки не будет приводить к немедленному завершению программы, а код этой ошибки будет запомнен в качестве значения стандартной функции IOResult без параметров. При отсутствии ошибок значение этой функции равно нулю. Например:

...

Writeln (' Введите имя файла');

Read (NameFil);

Assign (Fil,NameFil);

{$I-} { автоматический контроль отключен }

Reset (Fil);

Code:=IOResult;

If Code <> 0 Then Begin

Write ('Ошибка при открытии файла ',

NameFil,': ');

Case Code of

2: Writeln ('файл не найден');

3: Writeln ('путь к файлу не найден');

4: Writeln ('слишком много открытых файлов');

5: Writeln ('доступ закрыт');

6: Writeln ('нарушена информация в полях файла или системных областях');

8: Writeln ('недостаточно памяти');

10: Writeln ('несовместимые параметры окружения');

11: Writeln ('нераспознанный формат диска');

else

Writeln ('нераспознана');

end;

Exit;

end;

{$I+} { автоматический контроль включен }

...

При использовании функции IOResult, если отключен режим автоматического контроля, то после возникновения ошибки все последующие операции с любым файлом будут игнорироваться, пока не произойдет обращение к функции IOResult. Поэтому рекомендуется вызывать эту функцию сразу после выполнения операции, связанной с файлом. Кроме этого, обращение к функции обнуляет код ошибки, поэтому повторное обращение будет давать нулевой результат.