Вспомним, что типизированный файл – это последовательность элементов одного типа. А раз так, то при последовательном обращении к файлу текущий указатель переходит от элемента к элементу. Возникает вопрос: можно ли игнорировать последовательный доступ к файлу и сразу, например, обратиться к третьему элементу файла? Оказывается, можно.
Если есть необходимость нарушения последовательной записи или чтения из файла, текущий указатель, может быть изменен процедурой
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.