| 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