На этом шаге мы рассмотрим процедуры и функции, предназначенные для работы с файловым
указателем.
Процедура 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.
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);.
На следующем шаге мы познакомимся еще с некоторыми вспомогательными операциями,
которые можно совершать с файлами.