Теоретический материал: файловый ввод-вывод (Паскаль)

Процедуры и функции для работы с типизированными файлами

Вспомним, что типизированный файл - это линейная последовательность элементов одного типа. При каждом обращении к файлу (чтении, записи) его текущий указатель перемещается к следующему элементу. Возникает вопрос: можно ли нарушить порядок доступа к элементам файла и, например, не считывая из файла первый и второй элемент, сразу обратиться к третьему? Оказывается, можно.

Для изменения теущего положения указателя используется процедура

Seek (МуFilе, n);

где n - требуемое положение указателя.

Внимание! Нумерация элементов типизированного файла начинается с нуля.

Следовательно, для обращения к третьему элементу нужно записать: Seek (МуFilе, 2).

Seek (МуFilе, 0) - устанавливает указатель в начальную позицию (на первый элемент).

Seek (МуFilе, FileSize(МуFilе)) - устанавливает указатель после последнего элемента, то есть на признак конца файла.

Примечание. Функция FileSize(МуFilе) возвращает количество элементов типизированного файла МуFilе.

Текущую позицию указателя дает функция

FilePos (МуFilе);

Рассмотрите пример.

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

Рrogram Writing;
Var
  FileName : string; {строка, содержащая имя файла}
  FVar : file of char; {переменная файлового типа}
  Index : integer;
  Letter : char; {читаемый из файла символ}
Begin
  write('Enter filename: '); {предложение ввести имя файла}
  readln (FileName); {ввод имени файла}
  assign (FVar,FileName); {связь имени файла и переменной}
  {$I-} {отключен контроль ввода/вывода}
  reset (FVar); {открытие файла для чтения и записи}
  {$I+} {включен контроль ввода/вывода}
  if IOResult <> 0 {выход, если файл не открыт}
    then
      begin
        writeln ('Не открыт файл ', FileName);
        Halt
      end;
  while not EOF (FVar) do {цикл до конца файла}
    begin
      read (FVar, Letter); {чтение символа из файла}
      Letter:=Upcase(Letter); {преобразование букв}
      Seek(FVar,FilePos(FVar)-1); {перемещение указателя назад на 1 позицию}
      write(FVar,Letter); {запись преобразованной буквы}
    end; {конец цикла}
  close(FVar) {закрыть файл}
End.

Функция IOResult

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

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

Если контроль за выполнением операций ввода/вывода отключен с помощью директивы компилятора {$I-}, функция возвращает признак наличия ошибки в процессе  выполнения последней операции ввода/вывода. При успешном  завершении проверяемой операции   возвращаемое функцией IOResult значение   равно нулю.

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

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

{$I-} {отключение контроля ввода/вывода}
reset (F,'C:\TP7\BIN\Text.txt'); {открытие файла для чтения}
if IOResult <> 0
  then
    writeln ('Ошибка при открытии файла');
{$I+} {включение контроля ввода/вывода}

В своих программах Вы должны применять функцию IOResult.

Замечание. Функция применима к операциям файлового ввода/вывода независимо от вида файла (типизированный, нетипизированный, текстовый).