4. príklady


Posledná zmena: 13.10.2002

Banner Text 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