Процедура 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 to filesize(f)-3 do

Begin

seek (f,i+1); read (f,a); seek (f,i-1); write (f,a);

end;

{отрезаем последние два компонента.}

truncate (f);

close (f);

end.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: