Zadání:
Algoritmy:
Náhrada jednoho řetězce v souboru druhým
Vytvořte proceduru, která otevře zadaný soubor a překopíruj jej do dalšího souboru se zadaným
jménem, přičemž zadaný řetězec nahradí dalším řetězcem.
Možné řešení:
Nahrazují se jen řetězce, které nejsou rozděleny koncem řádku.
Je nutno nahradit všechny výskyty daného řetězce na řádku.
Předpokládejte, že zadaný soubor existuje a že zápis na disk je možný - nekontrolujte a
neošetřujte tyto případy.Soubor načítáme po řádcích a v nich vyhledáme pozici hledaného řetězce. Po nalezení řetězce
jej smažeme a nahradíme.
Algoritmus:
Pokud k hledání pozice užijeme standardní funkci POS, musíme před nahrazením řetězce hledat
další výskyty a tyto zapamatovat, neboť po náhradě další hledání řetězce začíná od začátku
řádku a mohl by najít již nahrazenou část.
Procedure ReplaceAll(FileNameIn,FileNameOut,What,ByWith:string);
{Procedura nahradi vsechny vyskyty vyrazu "What" na radku ve vstupnim souboru
vyrazem "ByWith". Vysledny soubor s nahrazenymi vyrazy je umisten do
vystupniho souboru.
Vyrazy rozdelene koncem radku se ingoruji.}
var FIn,FOut:text; {Soubory}
Position:integer; {Pozice vyskytu vyrazu}
Row:string; {Radek}
PosArr:array[1..255] of byte; {Pole s pozicemi vyskytu vyrazu}
i:byte; {Pocitadlo vyskytu vyrazu v radku}
begin {ReplaceAll}
for i:=1 to 255 do PosArr[i]:=0; {Vynuluj pole pozic}
{Otevreni souboru - zacatek.}
Assign(FIn,FileNameIn);
reset(FIn);
Assign(FOut,FileNameOut);
rewrite(FOut);
{Otevreni souboru - konec.}
while not eof(FIn) do begin
readln(FIn,Row);
i:=0; {Nastav pocet nalezenych vyskytu na 0}
repeat
Position:=Pos(What,Row); {Urci pozici vyrazu}
if Position>0 then begin {Je-li vyraz v radku}
i:=i+1; {Zvets pocet vyskytu}
PosArr[i]:=Position; {Uloz pozici vyskytu}
Delete(Row,Position,length(What)); {Smaz dany vyskyt}
end; {if}
until Position=0; {Dokud se vyskytuje hledany vyraz v radku}
while i>0 do begin {Dokud se vyraz vyskytuje}
Position:=PosArr[i]; {Urci pozici, kam se vlozi nahrada}
PosArr[i]:=0; {Vynuluj cislo pozice}
i:=i-1; {Sniz pocet vyskytu}
Insert(ByWith,Row,Position); {Nahrad vyraz}
end; {while}
writeln(FOut,Row); {Zapis radek}
end; {while}
Close(FIn); {Zavri }
Close(FOut); { soubory }
end; {ReplaceAll}
Seznam algoritmů
|
|
12. 4. 2000 |
|
|
||
|
|