MFF UK / Ústav teoretické fyziky / Tomáš Ledvinka
Přednášky
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
  Úvod
  Programy a algoritmy
  Píšeme program
  Píšeme program II
  Procedury a funkce
  Malujeme funkce
  Chyby. Typy I.
  Typy II. Pole a Záznamy
  Pole II.Řetězce.Soubory.
  Gnuplot.Interpolace...
  Matice. Velké O...
  Fronta,Zásobník. Postscript
  Bin. soubory, ...
    Neúplné vyh. log. výrazů
    Parametr typu funkce
    Otypované soubory
    Binární soubory
    Dyn. datové struktury
  Ukazatele,Objekty, ...
Počítačová algebra
Klasická elektrodynamika (2.r)
Vybrané partie OTR

Cvičení
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
Teoretická mechanika (2.r)
Klasická elektrodynamika (2.r)


Věda
. . . . . . . . . . . . . . . . . . . . . . . . . .
Diskové zdroje v OTR
Hyperbolické systémy v OTR


Kontakt
. . . . . . . . . . . . . . . . . . . . . . . . . .
Email
Konzultační hodiny


Ostatní
. . . . . . . . . . . . . . . . . . . . . . . . .
Mallorca
Ze společnosti

Soubory stejných záznamů

Již jste si asi všimli, že v posledních letech umožnil růst výkonu počítačů uchovávat v textové podobě kdejaká data, např. elektronickou poštou (tedy síťovým protokolem pro přenos textového dokumentu) dokážete přenést (a poté uchovat) nejen "Ahoj Honzo" ale i obrázky, archivy, viry...

Mnohé soubory ve vašem počítači ale nejsou textové.

Někdy se používají pro uložení mnoha stejných položek soubory vzniklé záznamem jednotlivých položek tak, jak jsou uloženy v paměti, za sebou do souboru. Budeme-li chtít realizovat velmi dlouhou strukturu typu fronta, můžeme ji kromě paměti uložit realizovat i na disku. K tomu použijeme soubor složený z libovolného počtu stejných záznamů. To Pascalu oznámíme deklarací typu

file of Typ_polozky

s proměnnými, tedy vlastně soubory, tohoto typu pak pracujeme pomocí procedur

Assign   přiřazení jména souboru
Rewrite   Vytvoření nebo zkrácení na nulovou
délku + otevření souboru pro četní i zápis
Reset   Otevření existujícího + otevření souboru pro četní i zápis
Read   Přečtení položky
Write   Zápis položky
Seek   Přesunutí polohy pro čtení a zápis na danou položku

S těmito informacemi můžeme již pochopit následující program:

program FrontaVSouboru;


type tZaznam = record
                  Jmeno : string[20];{!!! nesmi tam byt jen string !!!}
                  PolozkaA,
                  PolozkaB,
                  PolozkaC : integer; 
               end;

{Fronta v souboru:}
var frSoubor : file of tZaznam;
    frZacatek,
    frKonec  : integer;

{Operace:}

Procedure frZacni;
begin
   Assign(frSoubor,'Fronta.tmp');
   Rewrite(frSoubor);
end;

procedure frVloz(const X: tZaznam);
begin
  Seek(frSoubor,frKonec);
  frKonec:=frKonec+1;
  Write(frSoubor,X);
end;

function frVyber(var X: tZaznam): boolean;
begin
  frVyber := false;
  if (frZacatek<frKonec) then begin
    Seek(frSoubor,frZacatek);
    frZacatek:=frZacatek+1;
    Read(frSoubor,X);
    frVyber := true;
  end;
end;

Procedure frSkonci;
begin
   Close(frSoubor);
end;

var X : tZaznam;

begin
   frZacni;
   X.Jmeno := 'Polozka 1';  frVloz(X);
   X.Jmeno := 'Polozka 2';  frVloz(X);

   if frVyber(X) then Writeln(X.Jmeno);

   X.Jmeno := 'Polozka 3';  frVloz(X);

   if frVyber(X) then Writeln(X.Jmeno);

   X.Jmeno := 'Polozka 4';  frVloz(X);
   X.Jmeno := 'Polozka 5';  frVloz(X);

   while frVyber(X) do Writeln(X.Jmeno);

   frSkonci;
   readln;
end.

Velký pozor ! V případě, že používáme tento druh práce se soubory, musíme si být jisti, že v položce jsou opravdu uložena data, která chceme zapsat na disk. Uvažujme následující program:

program Zrada;

type tZaznam = record
                  Jmeno : string;
               end;
var X : tZaznam;
begin
   X.Jmeno := 'Velmi dlouhe jmeno (mozna jeste delsi)';

   Writeln(X.Jmeno);
   Writeln(sizeof(X));

   readln;
end.

Velmi nás překvapí, že velikost proměnné X jsou pouhé 4 byte. Důvod je prostý, řetězce typu string jsou jistou variantou dynamických polí a vlastní proměná je jen odkazem, kde má program hledat m.j. délku řetězce (délku pole), a znaky řetězce (prvky pole). Uložením tohoto údaje do souboru bychom si uložili pomíjivou (meta-) informaci, ale nikoli potřebná data.

Proto musí být součástí položek záznamů, ze kterých vytvážíme (otypovaný) soubor konstrukcí file of tPolozka, jen typy, jejichž velikost je neměnná, např:

Jednoduché typy ( integer, real, boolean, ...)
Pole s uvedenými mezemi ( array [1..N] of ... )
Řetězce s danou délkou ( string[255] ...)

I když budeme dodržovat tato pravidla, mohou nastat potíže, pokud přenášíme soubory a program, který s nimi pracuje, mezi počítači odlišných architektur (pozor na endiány) a nebo používáme různé kompilátory jazyka Pascal (ve starších verzích byl integer je 16-ti bitové číslo, v příštích nás nemine 64 bitů).

Pozn.: Myslím, že použití otypovaných souborů je velmi omezené

.