Střední škola stavební Jihlava
Sada 1 - Základy programování 16. Vstup a výstup do souboru Digitální učební materiál projektu: SŠS Jihlava – šablony registrační číslo projektu:CZ.1.09/1.5.00/34.0284 Šablona: III/2 - inovace a zkvalitnění výuky prostřednictvím ICT
Jaromír Železný © 2013
Projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky
Práce se soubory • soubor se v jazyce Pascal skládá z posloupnosti složek stejného typu • typ souboru musí být znám před vstupní/výstupní operací • deklarace souboru musí být provedena před jeho prvním použitím. • Soubory lze rozdělit do tří skupin: • textové soubory • soubory s udaným typem (typové soubory) • soubory bez udaného typu (netypové soubory)
Práce se soubory • proměnná typu soubor se deklaruje podobně jako ostatní proměnné v programu: var File1 File2 File3 File4
: : : :
file of file of text; { file; {
byte; { typové soubory } integer; textový soubor } netypový soubor }
Práce se soubory • před použitím proměnné typu soubor v programu musíme přiřadit jméno vlastnímu souboru pomocí procedury Assign • je-li proměnná přiřazena souboru, musí se otevřít, aby se připravila pro vstupní/výstupní operace se souborem • pokud soubor již existuje, můžeme jej otevřít procedurou Reset • nový soubor můžeme vytvořit a otevřít procedurou Rewrite • soubor, který existuje, můžeme otevřít v režimu pouze pro zápis procedurou Append
Práce se soubory • s textovým soubor, otevřeným procedurou Reset, může pracovat pouze v režimu pro čtení • do textových souborů otevřených procedurami Rewrite a Append můžeme pouze zapisovat
Práce se soubory procedura / funkce
Význam
Assign
Přiřadí jméno externího souboru proměnné typu soubor
Append
Otevře existující soubor pro vkládání
Close
Uzavře otevřený soubor
Read
Načte jednu nebo více hodnot ze souboru do jedné nebo více proměnných
ReadLn
Totéž co Read, ale až po sekvenci CRLF (přečte celý řádek)
Rename
Přejmenuje externí soubor
Reset
Otevře existující soubor
Rewrite
Vytvoří a otevře nový externí soubor
Write
Zapíše jednu nebo více hodnot do souboru
WriteLn
Totéž co Write a zápis ukončí sekvencí CRLF (odřádkuje)
Eof
Zjistí stav konce souboru
EoLn
Zjistí stav konce řádku v textovém souboru
IOResult
Vyhodnotí správnost vstupní/výstupní operace
Práce se soubory – textový soubor • Textový soubor – je definován jako sekvence znaků v řádkovém formátu – každý řádek je ukončen znakem konce řádku , po kterém může následovat znak posunu na další řádek (CRLF => carriage-return , line-feed)
Práce se soubory – textový soubor • vytvoření nového textového souboru se zápisem textu: program Vytvor_Textovy_Soubor; var F : text; begin Assign(F, ‘I:\Text.txt‘); { prirazeni nazvu } Rewrite(F); { otevreni } WriteLn(F, ‘Zapisuji do souboru.‘); { zapis } WriteLn(F, ‘Konec.‘); { zapis } Close(F); { uzavreni } end.
Práce se soubory – textový soubor • čtení ze souboru: program Nacti_Text; var F : text; Line : string[255]; I : integer; begin Assign(F, ‘Text.txt‘); Reset(F); I := 1; while not (Eof(F)) do begin ReadLn(F, Line); WriteLn(I, ‘ ‘, Line); I := I+1; end; Close(F); end.
{ promenna typu textovy soubor} { pro ulozeni jednoho radku } { citac jednotlivych radku } { { { {
otevreni } otevreni } nastaveni proměnné I na 1 } cyklus s podmínkou na začátku} { podmínkou je konec souboru (EOF)} { cteni radku} { zobrazeni prectene informace } { zvýšení poř.cisla rádku } { uzavreni souboru }
Práce se soubory- program • upravte program tak, aby pracoval s textovým souborem • použijte „pevnou šířku sloupců“ dle vlastního uvážení Program PraceSeZaznamem; Type Osoba = Record Prijmeni:String; Jmeno:String; Telefon:LongInt; end; Var Clovek:Array[1..5] of Osoba; I:Integer; Begin Writeln('Zadavej postupne jmena a telefonni cisla'); For I:=1 to 5 do Begin Writeln('Polozka c.', I); Write(' Zadej prijmeni ');Readln(Clovek[I].Prijmeni); Write(' Zadej jmeno ');Readln(Clovek[I].Jmeno); Write(' Zadej telefon ');Readln(Clovek[I].Telefon); Writeln; End; Writeln; Writeln('Vypis tefonniho seznamu:'); For I:=1 to 5 do Begin Write(I,'. ',Clovek[I].Prijmeni); Write(' ',Clovek[I].Jmeno); Writeln(' ',Clovek[I].Telefon); End; Readln; End.
Práce se soubory – typový soubor • v typových souborech je znám typ složky • složku typového souboru může tvořit libovolný jednoduchý (standardní), nebo strukturovaný (uživatelský) typ
Práce se soubory - typový soubor program Knihovna; type kniha = record Nazev : string[60]; Autor : string[20]; Rok : word; Nakladatel : string[10]; end; var F : file of kniha; Zaznam : kniha; I : integer;
Práce se soubory – typový soubor procedure MakeFile; begin Assign(F, ‘Knihovna.dbf‘); Rewrite(F); if IOResult <> 0 then Halt; {Halt = stop - ukončí běh programu} end;
Práce se soubory – typový soubor procedure ReadRecordKbd; begin with Zaznam do begin Write (‘Nazev knihy : ‘); Readln(Nazev); Write (‘Autor : ‘); Readln(Autor); Write (‘Rok vydani : ‘); Readln(Rok); Write (‘Vydavatel : ‘); Readln(Nakladatel); end; end;
Práce se soubory – typový soubor begin MakeFile; I := 1; while I <= 10 do; begin ReadRecordKbd; Write(F, Zaznam); if IOResult = 0 then I := I+1 else begin Close(F); Halt; end; end; Close(F); end.
Práce se soubory – typový soubor • program vytvoří nový typový soubor, v němž je každá položka datového typu záznam, který je nadeklarován s názvem Kniha • procedura MakeFile vytvoří na disku nový soubor a otevře jej pro zápis. Nejde-li soubor otevřít, běh programu se zastaví • procedura ReadRecordKbd umožňuje zadání každé jednotlivé složky souboru z klávesnice • v cyklus while se počítají vložené záznamy a přestane se provádět po vložení desátého záznamu • po vložení každého záznamu do souboru se provádí test správnosti V/V operace • pokud dojde při zápisu k chybě, soubor se uzavře a program skončí
Práce se soubory – bez udaného typu • soubory bez udaného typu se používají pro přístup k libovolnému diskovému souboru bez ohledu na jeho typ a jeho strukturu • soubor bez uvedeného typu se deklaruje: Var UnTypedFile : file; • při jejich otevírání lze definovat délku záznamu, pokud definici neprovedeme, nastaví se výchozí délka záznamu 128 byte
Práce se soubory – bez udaného typu • délku záznamu lze definovat jako druhý parametr procedur Reset nebo Rewrite: Reset(UnTypedFile, 256); Rewrite(UnTypedFile, 256); • jsou pro ně přístupné všechny standardní procedury a funkce kromě Read a Write, místo nich se k rychlému přenosu dat používají speciální procedury BlockRead a BlockWrite, které pracují s definovaným záznamem, jehož velikost byla určena při otevření souboru
Práce se soubory – bez udaného typu • využívá se například pro zjištění existence souboru libovolného typu na disku: Type S : string[80]; function FileExist(Name : S) : boolean; Var F : file; begin Assign(F, Name); Reset(F); if IOResult = 0 then begin Close(F); FileExist := True; end else FileExist := False; end;
Práce se soubory – bez udaného typu • test existence se provádí otevřením souboru a následnou kontrolou správnosti V/V operace • pokud byl soubor otevřen, funkce IOResult vrací nulovou hodnotu, a proto funkce FileExist bude vracet hodnotu True, v opačném případě vrací hodnotu False
Zdroje: TurboPascal 6.0 - příručka uživatele (help) Literatura: Radek HYLMAR: Programování pro úplné začátečníky, Computer Press, Brno, 2009, ISBN 978-80-251-2129-0 Januš DRÓZD, Rudolf KRYL: Začínáme s programováním, GRADA a.s., Praha, 1992, ISBN 80-85424-41-X Tomáš HRUŠKA: Pascal pro začátečníky, SNTL, Praha 1989, ISBN 80-03-00345-8 Materiál je určen k bezplatnému používání pro potřeby výuky a vzdělávání na všech typech škol a školských zařízení. Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je : Jaromír Železný Pokud není uvedeno jinak, byly při tvorbě použity volně přístupné internetové zdroje. Autor souhlasí se sdílením vytvořených materiálů a jejich umístěním na www.ssstavji.cz.