Процедура truncate.
Процедура truncate(f), где f- имя файловой переменной, отсекает часть открытого файла, начиная с текущего компонента, и подтягивает на его место конец файла.
Пример 5. Задан файл вещественных чисел abc.dat. Удалить из него максимальный и минимальный элементы.
Рассмотрим две программы, решающие эту задачу. Алгоритм первой состоят в следующем: считываем компоненты файла в массив, в котором находим максимальный и минимальный элементы и их номера. Открываем файл для записи и вносим в него все элементы, за исключением максимального и минимального.
program Pr5;
var
f:=file ofreal;
max, min:real;
j, I, nmax, nmin:integer;
a:array [1..300] of real;
Begin
assign(f,’abc.dat’);
reset(f);
{Запоминаем в переменной j количество компонентов в файле}
j:=filesize(f);
{Считываем компоненты файла в массив а}
for i:=1 to filesize(f) do read(f, a[i]);
close(f);
{открываем файл для записи }
rewrite(f);
{Начальное присваивание максимального и минимального элементов массива и их индексов}
max:=a[1]; min:=a[1];
nmax:=1; nmin:=1;
{Основной цикл для поиска максимального и минимального элементов массива и их индексов}
for i:=2 to filesize(f) do
Begin
if a[i]>max then
Begin
max:=a[i];
nmax:=i
end;
if a[i]<min then
Begin
min:=a[i]; nmin:=i;
end;
end;
{Перезапись элементов массива в файл за исключением элементов с номерами nmax и nmin }
for i:=1 to filesize(f) do
if (i<>nmax) and (i<>nmin) then
write (f, a[i]);
Close(f)
End.
Вторая программа работает следующим образом. Находим максимальный и минимальный элементы и их номера среди компонентов файла(описание программы var2). Если nmin>nmax, то меняем содержимое переменных nmin и nmax. Далее элементы, лежащие между минимальным и максимальным ( формально между элементами с номерами nmin и nmax), сдвигаем на один порядок влево. Тем самым мы убираем элемент с номером nmin . После этого все компоненты, лежащие после элемента с номером nmax, сдвинем на два порядка влево. Этим мы сотрем максимальный элемент. Затем два последних компонента в файле необходимо удалить.
program var4;
Var
f:=file of real;
a: real;
max, min:real;
i, nmax, nmin:integer;
Begin
assign(f,’abc.dat’);reset(f);
{Поиск максимального и минимального элементов в файле и их индексов}
for i:=0 to filesize (f)-1 do
Begin
read(f,a);
if i=0 then
Begin
max:=a; nmax:=i; min:=a; nmin:=i
End
Else
Begin
if a>max then
begin
max:=a; nmax:=i;
end;
if a<min then
Begin
min:=a; nmin:=i;
end
End
end;
{сравниваем nmin и nmax }
if nmax<nmin then
Begin
i:=nmax; nmax:=nmin; nmin:=i
end;
{сдвигаем элементы, лежащие между компонентами с номерами nmin и nmax, на один влево }
for i:=nmin to nmax-2 do
Begin
seek(f,i+1); read(f,a); seek(f,i); write(f,a)
end;
{сдвигаем элементы, лежащие после компонента с номером nmax, на 2 влево }
for i:=nmax tofilesize(f)-3 do
Begin
seek(f,i+1); read(f,a); seek(f,i-1);write(f,a);
end;
{отрезаем последние два компонента.}
truncate(f);
close(f);
end.