Шаг 57.
Процедуры и функции, использующие файловый указатель

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

Процедура Seek
Функция FileSize
Функция FilePos
Функция Eof


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

    1. Установка указателя. Процедура Seek предназначена для изменения положения указателя файла. Ее общий вид:


     Seek (<имя файловой переменной>,<номер позиции>);

    Номер позиции указывает номер элемента, на который нужно разместить указатель файла. Если номер позиции равен 0, то указатель располагается в начале файла (на первом элементе).

   

    2. Определение количества элементов в файле. Функция FileSize предназначена для подсчёта элементов файла. Общий вид:


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

    Результатом работы функции будет величина типа Integer, значение которой равно количеству элементов в файле.

   

    3. Определение номера элемента. Функция FilePos возвращает номер элемента, на который показывает указатель файла (номер текущего элемента). Её общий вид:


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

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

Program Pr3;
Var
  K: File Of Integer; {Файловая переменная}
  Nomer: Byte; {Номер, с которого начинается вывод}
  FS:Integer; {Количество элементов в файле}
  i: Integer; {Счетчик цикла}
Begin
  {Связываем файловую переменную k с файлом DAN.DAT }
  Assign(K,'DAN.DAT');   
  Reset(K); {Открываем файл для чтения}
  FS:= FileSize(K);
  Writeln('Количество элементов в файле: ',FS);
  Write('Введите номер элемента, с которого нужно 
         начинать вывод (число от 1 до ',FS,'): ');
  Readln(Nomer);
  {Перемещаем указатель на заданное число}
  Seek(K,Nomer-1); 
  Writeln('Числа из файла: ');
  For i:=Nomer To FS Do
   Begin
     Readln(k,a); {Считываем текущее число}
     Writeln(a);   {Выводим его на экран}
   End; 
  Close(k); {Закрываем файл}
End.
Текст этой программы можно взять здесь.


Дополните программу проверкой введенного числа Nomer. Оно должно принадлежать промежутку от 1 до количества элементов файла.
Решение и комментарии вы можете посмотреть здесь.

    4. Определение достижения конца файла. При написании программ в некоторых случаях желательно знать, достигнут или нет конец файла, то есть все ли элементы прочитаны. Для ответа на этот вопрос может использоваться логическая функция:


     Eof(<имя файловой переменной>):Boolean;

    Она принимает истинное значение (True), если достигнут конец файла, и ложное (False) - в противном случае. Напомним, что при достижении конца файла указатель располагается за последним элементом файла (рис.1):


Рис.1. Положение указателя в случае истинности функции Eof

    Изменим предыдущую программу, использовав рассмотренную функцию:

Program Pr3;
Var
  K: File Of Integer; {Файловая переменная}
  Nomer: Byte; {Номер, с которого начинается вывод}
  FS:Integer; {Количество элементов в файле}
  i: Integer; {Счетчик цикла}
Begin
  {Связываем файловую переменную k с файлом DAN.DAT }
  Assign(K,'DAN.DAT');   
  Reset(K); {Открываем файл для чтения}
  FS:= FileSize(K);
  Writeln('Количество элементов в файле: ',FS);
  Write('Введите номер элемента, с которого нужно 
         начинать вывод (число от 1 до ',FS,'): ');
  Readln(Nomer);
  {Перемещаем указатель на заданное число}
  Seek(K,Nomer-1); 
  Writeln('Числа из файла: ');
  While Not(Eof(K)) Do {Пока не достигнут конец файла}
   Begin
     Readln(k,a); {Считываем текущее число}
     Writeln(a);   {Выводим его на экран}
   End; 
  Close(k); {Закрываем файл}
End.
Текст этой программы можно взять здесь.

    Использованное в заголовке цикла условие обрабатывается следующим образом: сначала анализируется значение функции Eof(K). Эта функция возвращает значение "ложь", так как указатель расположен не в конце файла. Отрицание (Not) лжи есть истина. Поэтому проверяемое условие является истинным и, следовательно, выполняется тело цикла. Первый оператор в теле цикла - это конструкция Readln(k,a);, при выполнении которой элемент, на который показывает указатель, помещается в переменную a, и указатель перемещается на следующую позицию. Так продолжается до тех пор, пока указатель не переместится за последний элемент. В этом случае значение функции Eof(K) есть "истина", а отрицание истины - "ложь". Таким образом, проверяемое условие становится ложным, тело цикла не выполняется и осуществляется переход к оператору, расположенному после тела цикла. Это конструкция Close(K);.

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


Процедура Seek Функция FileSize Функция FilePos Функция Eof

Предыдущий шаг Содержание Следующий шаг