|
Posledná zmena: 13.10.2002
|
textové súbory
|
Textové súbory
- vo všetkých úlohách si
treba dávať pozor na čítanie za koncom súboru
- pri riešení úloh sa nesmú
používať ani reťazce ani polia
kopírovanie súboru
bez medzier na konci riadkov
|
Napíšte program, ktorý
prekopíruje vstupný textový
súbor vstup.txt do výstupného
súboru vystup.txt tak že:
a) výstupný súbor
nebude obsahovať medzery, ktoré sa
nachádzali vo vstupnom súbore
na konci riadkov
b) postupnosť medzier vo vstupnom textovom
súbore bude nahradená iba
jednou medzerou (v riešení treba
inc nahradiť priradením v
komentári)
|
var
t1,t2:TextFile;
z:char;
p:integer;
begin
AssignFile(t1,'test.txt'); Reset(t1);
AssignFile(t2,'test1.txt'); Rewrite(t2);
p:=0;
while not eof(t1) do
if eoln(t1) then begin
readln(t1); writeln(t2); p:=0;
end
else begin
read(t1,z);
if z=' ' then inc(p) // p:=1
else begin
write(t2,z:p+1); p:=0;
end;
end;
CloseFile(t1); CloseFile(t2);
end;
|
použitie pomocného súboru
|
Súbor ggg.txt by bol normálny
textový, keby za každým znakom
#13 bol aj znak #10 (za niektorými
chýbajú). Vytvorte normálny
textový súbor ggg.txt. Použijeme
nové príkazy:
RenameFile(Old,New:string);
DeleteFile(Name:string);
FileExists(name:string):Boolean;
Budeme musieť použiť pomocný súbor,
ktorý na záver zrušíme.
Meno pomocného súboru musíme
vymyslieť také, pre ktoré
ešte neexistuje žiaden súbor.
Pozn. na generovanie
mena pomocného súboru existujú
špecializované systémové
funkcie GetTempFileName, GetTempDrive
|
const
meno='ggg.txt';
var
t1,t2:TextFile;
tmp:integer;
z:char;
begin
tmp:=0; while FileExists(IntToStr(tmp)) do inc(tmp);
RenameFile(meno,IntToStr(tmp));
AssignFile(t1,IntToStr(tmp)); Reset(t1);
AssignFile(t2,meno); Rewrite(t2);
while not eof(t1) do begin
read(t1,z);
if z=#13 then write(t2,#13#10)
else if z<>#10 then write(t2,z);
end;
CloseFile(t1); CloseFile(t2);
DeleteFile(IntToStr(tmp));
end;
|
vyhodenie komentárov z pascalovského
programu
|
Program z pascalovského programu
vyhodí všetky komentáre v
{} zátvorkách. Predpokladáme,
že tieto symboly sa nevyskytujú v
žiadnych reťazcoch v súbore.
|
var
t1,t2:TextFile;
z:char;
kom:boolean;
begin
AssignFile(t1,'test.pas'); Reset(t1);
AssignFile(t2,'test1.pas'); Rewrite(t2);
kom:=false;
while not eof(t1) do begin
read(t1,z);
if z='{' then kom:=true;
if not kom then write(t2,z);
if z='}' then kom:=false;
end;
CloseFile(t1); CloseFile(t2);
memo1.lines.LoadFromFile('test1.pas');
end;
|
korytnačky a súbor
|
Daný je súbor celých
čísel navzájom oddelených
medzerami a koncami riadkov. Napíšte
program, v ktorom bude korytnačka interpretovať
tento súbor nasledovne:
- ak sa v riadku nachádza len jedno
číslo, znamená dĺžku kroku
dopredu - ak sa v riadku nachádzajú
dve čísla, sú to dĺžky strán
obdĺžnika, ktorý má korytnačka
nakresliť na pozícii, kde sa práve
nachádza - ak sa v riadku nachádzajú
tri čísla, sú to parametre
procedúry poly
Môžete predpokladať, že sa v žiadnom
riadku súboru nenachádza viac
čísel ako tri.
|
var
k:TKor;
procedure poly(n,d,u:integer);
begin
while n>0 do begin
k.Dopredu(d);
k.Vpravo(u);
dec(n);
end;
end;
var
t:TextFile;
x1,x2,x3,i:integer;
begin
AssignFile(t,'kor.txt'); Reset(t);
k:=TKor.Create;
while not seekeof(t) do begin
read(t,x1);
if seekeoln(t) then
k.Dopredu(x1)
else begin
read(t,x2);
if seekeoln(t) then
for i:=1 to 2 do begin
k.Dopredu(x1); k.Vpravo(90);
k.Dopredu(x2); k.Vpravo(90);
end
else begin
read(t,x3);
poly(x1,x2,x3);
end;
end;
end;
CloseFile(t);
end;
|
čísla v súbore oddelené
';'
|
Daný je súbor celých
čísel oddelených navzájom bodkočiarkami a koncami riadkov.
Zistite súčet všetkých čísel.
|
var
t:TextFile;
sucet,x:integer;
z:char;
begin
AssignFile(t,'cisla.txt'); Reset(t);
sucet:=0;
while not seekeof(t) do begin
x:=0;
repeat
if not eoln(t) then read(t,z)
else z:=';';
if (z>='0') and (z<='9') then
x:=x*10+ord(z)-ord('0');
until z=';';
inc(sucet,x);
end;
CloseFile(t);
Memo1.Lines.Add('súčet = '+IntToStr(sucet));
end;
|
maximum z čísel v súbore
|
Daný je súbor celých
čísel oddelených navzájom medzerami a koncami riadkov.
Nájdite najväčšie
číslo.
|
var
t:TextFile;
max,x:integer;
bol:boolean;
begin
AssignFile(t,'cisla.txt'); Reset(t);
bol:=false;
while not seekeof(t) do begin
read(t,x);
if not bol or (x>max) then begin
max:=x; bol:=true;
end;
end;
CloseFile(t);
if bol then
Memo1.Lines.Add('maximum = '+IntToStr(max))
else
Memo1.Lines.Add('žiadne číslo v súbore');
end;
|
druhé minimum v súbore
|
Daný je súbor celých
čísel oddelených navzájom medzerami a koncami riadkov.
Nájdite druhé najmenšie
číslo.
|
var
t:TextFile;
min,min2,x,bol:integer;
begin
AssignFile(t,'cisla.txt'); Reset(t); bol:=0;
while not seekeof(t) do begin
read(t,x);
if (bol=0) or (x<min) then begin
min2:=min; min:=x;
if bol<2 then inc(bol);
end
else if (bol=1) and (x>min) then begin
min2:=x; bol:=2;
end
else if (bol=2) and (x<min2) and (x>min) then
min2:=x;
end;
CloseFile(t);
if bol=2 then
Memo1.Lines.Add('2. minimum = '+IntToStr(min2))
else
Memo1.Lines.Add('málo čísel v súbore');
end;
|
Ďalšie úlohy
- V textovom súbore slova.txt je
v každom riadku jedno slovo. Napíšte
program, ktorý vytvorí súbor
najdlhsi.txt, v ktorom budú všetky
slová zo vstupného súboru,
ktoré majú dĺžku ako najdlhšie
slovo vstupného súboru. (nehľadajte
najprv dĺžku najdlhšieho slova zo vstupného
súboru).
- Napíšte program, ktorý
v pascalovskom súbore upraví
riadky obsahujúce znak ";"
takto: medzery za ";" vyhodí;
zo zvyšku riadku (ak je neprázdny)
vyrobí nový riadok tak, že
tento bude začínať rovnakým
počtom medzier aký bol za bodkočiarkou
(iná verzia: nový riadok bude
začínať vždy pod prvým slovom
pôvodného riadku –“pascalovsky”).
- Napíšte program, ktorý
prekopíruje jeden súbor do
druhého, ale tak, že všetky riadky
budú mať dĺžku 80 znakov t.j. vloží
medzi slová (rovnomerne) toľko medzier,
aby sa riadok "natiahol" na 80
znakov.
- Napíšte program, ktorý spočíta
a vypíše pod seba počet slov v každej vete
vstupného textového súboru.
Veta je postupnosť slov ukončená bodkou.
Slová sú oddelené jednou medzerou
alebo koncom riadku. Súbor je korektný.Číselné funkcie
|
© 2002 AB, KVI blaho@fmph.uniba.sk
|