Шаг 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
Предыдущий шаг
Содержание
Следующий шаг