В рассматриваемых ниже примерах при обработке файлов массивы не используются, поскольку размер файла в общем случае может превышать максимально возможный размер переменной, равный 64 Кбайт.
Пример 1.
Компонентами типизированного файла являются вещественные числа. Удалить из состава файла максимальный элемент.
Ниже приведено два варианта решения поставленной задачи.
В программе DelFile1 вначале производится поиск номера kmax максимального компонента файла, после чего все компоненты, расположенные правее kmax, сдвигаются на один шаг влево. Поскольку размер файла при удалении компонента должен сократиться, то файл "обрезается" по последнему компоненту с помощью процедуры Truncate.
Program DelFile1;
TypeFileReal = file of real;
Var kmax : longint; { номер максимального компонента }
R, { значение текущего компонента }
Rmax : real; { значение максимального компонента }
F : FileReal;
Begin
Assign(F,'F.dat'); Reset(F);
If FileSize(F)<2 then
Rewrite(F)
Else
Begin
Read(F,Rmax); kmax:=0;
While noteof(F) do{ Определение местоположе- }
Begin{ ния максимального компо- }
Read(F,R); { нента файла }
If R>Rmax then
Begin
Rmax:=R; kmax:=FilePos(F)-1;
End;
End;
Ifkmax<FileSize(F)-1 then
Begin
Seek(F,kmax+1);
WhileFilePos(F)<FileSize(F) do
Begin{ Сдвиг компонентов файла,}
Read(F,R); { начиная с номера kmax+1,}
Seek(F,FilePos(F)-2); { на один компонент }
Write(F,R); { влево (при этом }
Seek(F,FilePos(F)+1); { элемент с номером kmax }
End;{ будет уничтожен) }
End;
Seek(F,FileSize(F)-1); { Удаление последнего ком- }
Truncate(F); { понента файла }
End;
Close(F);
End.
В программе DelFile1 учитывается, что после выполнения процедуры Read указатель файла перемещается на следующий компонент, поэтому переменной kmax присваивается значение FilePos(F)-1.
При анализе программы DelFile1 следует иметь в виду, что функция FileSize(F) определяет количество компонентов в файле F, при этом номером последнего компонента является значение FileSize(F)-1; в процедуре Seek(F,k) параметр k - это номер компонента, на который устанавливается указатель файла F.
В программе DelFile2 в файл F2 переписываются из файла F1 все компоненты, кроме максимального. После этого файл F1 уничтожается, а файл F2 переименовывается, получая имя, которое первоначально имел файл F1.
Program DelFile2;
Type FileReal = file of real;
Var kmax : longint; { номер максимального компонента }
R, { значение текущего компонента }
Rmax : real; { значение максимального компонента }
F1,F2 : FileReal;
Begin
Assign(F1,'F1.dat'); Reset(F1);
If FileSize(F1)<2 then
Begin
Rewrite(F1); Close(F1)
End
Else
Begin
Assign(F2,'F2.dat'); Rewrite(F2);
Read(F,Rmax); kmax:=0;
While not eof(F1) do
Begin
Read(F1,R);
IfR>Rmax then
Begin
Rmax:=R; kmax:=FilePos(F)-1;
End;
End;
Seek(F1,0);
Fork:=0 tokmax-1 do{ 1 }
Begin
Read(F1,R); Write(F2,R);
End;
Seek(F1,kmax+1);
While not eof(F1) do{ 2 }
Begin
Read(F1,R); Write(F2,R);
End;
Close(F1); Close(F2);
Erase(F1); Rename(F2,'F1.dat');
End;
End.
Если максимальный компонент расположен в начале файла, то цикл 1 работать не будет; если этот компонент является последним в файле, то не будет отрабатываться цикл 2.
Структура программы DelFile2 более предпочтительна, по крайней мере в смысле читабельности.
Пример 2. Перед k-ым компонентом типизированного файла ( ) вставить новое значение b.
Здесь, как и в примере 1, могут быть два варианта решения:
- с помощью процедуры Seek сдвинуть компоненты k, k+1, k+2, … вправо на одну позицию (начиная с последнего компонента), после чего записать в k-ый компонент новое значение b;
- в буферный файл F2 переписать из файла F1 компоненты 0, 1, …, k-1, затем новое значение b и все остальные компоненты файла F1; после этого уничтожить файл F1 и переименовать файл F2.
В текстовых файлах F1 и F2 содержатся целые числа, упорядоченные по возрастанию. Объединить в файле F3 содержимое файлов F1 и F2, сохранив их упорядоченность. Сортировку данных не производить. Учесть, что в частном случае файлы F1 и F2 могут быть пустыми.
Program ComFiles;
Label10;
Vark1,k2 : integer;
Cond : boolean;
F1,F2,F3 : text;
Begin
Assign(F1,'F1.dat'); Reset(F1);
Assign(F2,'F2.dat'); Reset(F2);
Assign(F3,'F3.dat'); Rewrite(F3);
IfSeekEof(F1) or SeekEof(F2) then
Goto 10;
Read(F1,k1); Read(F2,k2); { Чтение первого компонента }
Cond:=true;
While Cond do{ Цикл выполняется до тех пор, пока }
If k1>k2 then { не будет исчерпан файл F1 или F2 }
Begin
Writeln(F3,k2);
If SeekEof(F2) then { При каждом выполнении цикла }
Begin{ из двух сравниваемых чисел }
Cond:=false; { k1 и k2 в файл F3 записывает-}
Writeln(F3,k1) { ся меньшее, после чего пере- }
End{ сланное число заменяется но- }
Else { вым значением из соответству-}
Read(F2,k2); { ющего файла }
End
Else
Begin
Writeln(F3,k1);
IfSeekEof(F1) then
Begin
Writeln(F3,k2); Cond:=false
End
Else
Read(F1,k1);
End;
10:
While not SeekEof(F1) do{ В F3 переписывается ос-}
Begin{ таток из файла F1 или }
Read(F1,k1); Writeln(F3,k1) { из файла F2. Если один }
End; { из исходных файлов пус-}
While not SeekEof(F2) do{ той, в F3 полностью пе-}
Begin { реписывается другой }
Read(F2,k2); Writeln(F3,k2){ файл. Если F1 и F2 пус-}