Soubory & spol.

Data v počítači je záhodno ukládat na vhodné médium. Takovým médiem bývá zpravidla disketa nebo pevný disk, kam se data ukládají do souborů. V Pascalu je definován typ soubor:

Var

F: File of typ;

Se souborem se pracuje vcelku snadno. Jen je potřeba si uvědomit, že proměnná typu soubor a skutečný soubor na disku jsou dvě různé věci. Na počátku spolu vůbec nesouvisí. Proto musíme přidělit proměnnou ke skutečnému souboru:

Assign( proměnná, jméno_souboru );

Potom už pracujeme s proměnnou soubor a tím i se souborem na disku.

Rewrite( soubor );

Vytvoří nový (prázdný) soubor. Do něj pak lze zapisovat.

Reset( soubor );

Otevře soubor pro čtení i zápis. Ze souboru lze číst i do něj zapisovat.

Close( soubor );

Uzavře soubor. Pak do něj nelze zapisovat, ani z něj číst.

Read( soubor, data );

Čtení ze souboru. Data se načtou do proměnné data.

Write( soubor, data );

Zápis do souboru. Obsah proměnné data se uloží do souboru.

Var
F: File of Integer;
Begin
Assign( F, 'G:\Test.Dat');
Rewrite( F );
Write( F, i );
Reset( F );
Read( F, i );
Close( F );
End;

Příklad (pokračování příkladu z minulé lekce):
Program Dotaznik;
 Uses Crt, DOS;
 Type
  Osoba = Record
   Jmeno   : String[31];
   Prijmeni: String[31];
   RodneCis: String[11];               { RRMMDD/nnnn }
   Adresa  : Array[1..3]of String[63];
   Telefon : String[31];
   Vek     : Byte;
   Pohlavi : Char;
  end;
 Var
  Nekdo : Osoba;
  JmSoub: String;                      { Jméno souboru }
  Volba : Integer;                     { Volba v menu }
  Cislo : Integer;                     { Číslo záznamu }
{---------------------------------------------------}
 Procedure WriteXY( X, Y: Byte; S: String );
 Function Stari( RC: String ): Integer;
 Procedure Form;
 Procedure Nacti( var Kdo: Osoba );
 Procedure Vokaz( var Kdo: Osoba );
Nová část

Procedure ZeSoub(Jm:String;Cis:Integer;Var Kdo:Osoba);
  Var
   F: File of Osoba;
  Begin
   Assign( F, Jm );                    { Soubor F má jméno Jm }
   Reset( F );                         { Otevření souboru }
   While (Cis>0 )and not EOF( F ) do Begin
                    {Dokud jsem nenačetl všechny a není konec souboru...}
    Read( F, Kdo );                    { Načti ze souboru F data do Kdo }
    Cis:= Cis-1;                       { a zmenši počet k načtení }
   end;
   Close( F );                         { Zavření souboru }
   Vokaz( Kdo );                       { Co je načteno, ukázat }
  End;

Procedure PridejDoSoub( Jm: String; Var Kdo: Osoba );
  Var
   F  : File of Osoba;
   Pom: Osoba;
  Begin
   Assign( F, Jm );                    { Soubor F má jméno Jm }
   Reset( F );                         { Otevření souboru }
   While not EOF( F ) do Begin
                                       { Dokud není konec souboru...}
    Read( F, Pom );                    {    Načti ze souboru F data do Pom }
   end;
   Write( F, Kdo );                    {    Ulož do souboru }
   Close( F );                         { Zavření souboru }
   Vokaz( Kdo );                       { Co je načteno, ukázat }
  End;

 Procedure NovySoub;                   {Zadání jména souboru }
  Var
   F: File;
  Begin
   Write( 'Jméno souboru: ' );
   WriteLn( JmSoub );
   Write( '   Nové jméno: ' );
   Readln( JmSoub );
   Assign( F, JmSoub );                { Soubor F má jméno JmSoub }
   Rewrite( F );                       { Přepiš soubor }
   Close( F );                         { Uzavři soubor }
  End;

 Function Menu: Integer;
  Var
   Volba: Integer;
  Begin
   WriteLn( '[1] Nové jméno' );
   WriteLn( '[2] Dalsí jméno' );
   WriteLn( '[3] Predchozí jméno' );
   WriteLn( '[4] Novy soubor' );
   WriteLn( '[0] KONEC');
   Readln( Volba );
   Menu:= Volba;
  End;
{---------------------------------------------------}
 Begin
  ClrScr;
  JmSoub:= 'Pas_09.Dat';
  Cislo:= 0;
  Repeat
   Volba:= Menu;
   Case Volba of
    1: Begin
        Nacti( Nekdo );
        PridejDoSoub( JmSoub, Nekdo );
       end;
    2: Begin
        Cislo:= Cislo+1;
        ZeSoub( JmSoub, Cislo, Nekdo );
       end;
    3: Begin
        If Cislo>1 then Cislo:= Cislo-1;
        ZeSoub( JmSoub, Cislo, Nekdo );
       end;
    4: NovySoub;
   end;
  Until Volba=0;
 End.

Tento příklad se zdá poněkud dlouhý. Budiž ctěnému publiku útěchou, že nemám žádných doplňujících úkolů.