Kurs FORTRANU | ||
---|---|---|
Předcházející | Další |
Prostřednictvím vstupů a výstupů komunikuje program s okolím. Tato část jazyka je mimořádně hluboce propracovaná a tím pádem i komplikovaná. Obecně lze říci, že se při každém I/O příkazu přečte/vypíše jeden řádek nebo záznam. Každý příkaz je též spojen s tzv. jednotkou (povinný parametr) která identifikuje jednotlivé připojené soubory. Standardní jednotka pro I/O se identifikuje hvězdičkou. Každý příkaz má též kontrolní parametry umožňující ošetřit chybové stavy.
Otevření souboru a spojení s jednotkou. Příkaz má tvar:
open([unit=]číslo,file='nazev',status='new/old/scratch', access='sequential/direct/append',form='formated/unformated', action='read/write/readwrite',recl=číslo,...)
parameter status udává stav souboru při jeho otevření. Pokud soubor neexistuje a je otevřen s parametrem old, dostaneme chybu. Paremeter scratch vytváří dočasný soubor. Přístup k souboru může být buď sekvenční, přímý nebo můžeme do již existujícího souboru dopisovat. Záznamy v něm jsou buď formatované (obyčejně u souborů typu počítač-člověk) nebo neformatované (soubory typu počítač-počítač).Můžeme též předem specifikovat akci kterouy chceme se souborem dělat a parametrem recl definovat délku záznamů v souboru.
Uzavření souboru. Příkaz má tvar:
close([unit=]číslo,status='keep/delete',...)
parameter status udává jestli má po uzavření soubor existovat nebo ne.
Zjištění informací o souboru. Příkaz má tvar:
inquire(file='název',exist=.true./.false.,...)
tento příkaz má velké množství nejrůznejších parametrů a lze s ním zjistit o souboru kde co. Nejčastější použití je zjištění, jestli daný soubor existuje nebo ne. Například:
logical :: existuje inquire(file='data.dat',exist=existuje) write(*,*) existuje
Zapsání značky konec souboru do souboru. Příkaz má tvar:
endfile([unit=]číslo,...)
paraemtry má pouze chybové.
Vrácení o jeden záznam vzad. Příkaz má tvar:
backspace([unit=]číslo,...)
paraemtry má pouze chybové.
Přetočení souboru na začátek. Příkaz má tvar:
rewind([unit=]číslo,...)
paraemtry má pouze chybové.
Na čtení záznamů nebo řádků ze souboru používáme příkaz read. Každé jeho zavolání způsobí načtení jednoho záznamu nebo řádku z daného souboru. To znamená, že opakované čtení jednoho řádku lze procés jedině ve spolupráci s příkazem backspace nebo vhodným formátováním. Příkaz přiřadí hodnoty do proměnný uvedených za příkazem.
read([unit=]číslo,[fmt=]formát,[end=návěší],..) proměnné
jako jednotka může být uvedeno číslo předím otevřeneho souboru, hvězdička udávající standardní vstup nebo znaková konstanta ze které se čte. Formát je udání formátové specifikace nebo hvězdička udávající volný formát. Je-li uveden parameter end a dočteme se na konec souboru, skočí příkaz na předem dané návěští.
Na zápis záznamů nebo řádků do souboru používáme příkaz write. Každé jeho zavolání způsobí zapsání jednoho záznamu nebo řádku do daného souboru. Ve fortranu je to obvyklý způsob zpracování. Není zvykem vypisovat na jeden řádek pomocí více příkazů, i když to lze udělat. Příkaz vypíše hodnoty proměnných uvedených za příkazem.
write([unit=]číslo,[fmt=]formát,[advance='no'],..) proměnné
jako jednotka může být uvedeno číslo předtím otevřeného souboru, hvězdička udávající standardní výstup nebo znaková konstanta do které se zapisuje. Formát je udání formátové specifikace nebo hvězdička udávající volný formát. Je-li uveden parameter advance='no' pak se neprovádí odřádkování a následující příkaz write začne vypisovat na tentýž řádek.
Formátování je ve fortranu mimořádně bohaté. Zde jsou uvedeny jen nejvíce používané způsoby. Postup při použití formátu je takový, že se postupně berou proměnné které se mají vypsat a asociují se s příslušným formátem. Pokud si neodpovídají typově dojde k chybě. Pokud neodpovídá počet formátových specifikací a počet veličin je v případě, že je formát delší než výspuní veličiny zbytek ignorován, pokud je naopak více výstupních veličin než formátů dojde k odřádkování. Všechny formáty odpovídající veličinám lze opakovat. Při formátovacím řízení se lze předbíhat i vracet.
Nejjednodužší a taktéž nejvíce používaný formát je volný formát uvozený hvězdičkou. V takovém případě se formát přizpůsobuje příslušným I/O veličinám které jsou oddělené mezerou nebo čárkou. Znakové veličiny musí být při vstupu uvedeny v apostrofech nebo uvozovkách.
Program degrees ! ukazka vstupu a vystupu volnym formatem real :: ra1,ra2,dec1,dec2,ra,dec character(len=80) :: objname write(*,*) 'Degrees: program na prevod souradnic z hodin na stupne' write(*,*) ! hlavni cyklus do ! precteni objektu z klavesnice write(*,*) 'zadej nazev objektu v apostrofech, hodiny, minuty v RA a dec:', & ' konec=^D|^Z' read(*,*,end=666) objname,ra1,ra2,dec1,dec2 ra = 15.0*(ra1 + ra2/60.0) dec = dec1 + dec2/60.0 write(*,*) objname,ra,dec enddo 666 continue end
Uživatel může přesně předepsat tvar vypisovaných dat pomocí formátových konverzí. V tomto případě je přesně zadaná celková šířka vypisovaných informací a ty tím pádem nemusí být oddělené nijak.
V tomto případě má formát tvar
Iw[.m]
kde w udává celkovou šířku čteného čísla. V případě, že je uvedeno m pak se při výstupu dané číslo doplnuje z leva nulami tak aby mělo číslo minimálně m znaků.
Tabulka 1. Vstup I edicí
Vstupní pole | Edice | Údaj v počítači |
---|---|---|
_1234 | I5 | 1234 |
_1234 | I5.1 | 1234 |
_-_34 | I5 | -34 |
_ | I1 | 0 |
3456 | I2 | 34 |
Tabulka 2. Výstup I edicí
Údaj v počítači | Edice | Výstupní pole |
---|---|---|
1234 | I5 | _1234 |
12 | I5.4 | _0012 |
-34 | I2 | ** |
V tomto případě má formát tvary
Fw.d nebo Ew.d[Ee] nebo Gw.d[Ee]
kde w udává celkovou šířku čteného čísla. V případě, že je uvedeno d pak při výstupu má dané číslo d desetinných míst. Edice F vypisuje čísla v normálním a edice E v exponenciálním tvaru. e pak udává počet míst v exponentu. Na vstupu jsou E a F ekvivalentní. Edice G pak slouží na vhodné zkloubení E a F edice tak aby měl údaj co nejmenší počet znaků. Edice G se uplatňuje opět pouze na výstupu.
Tabulka 3. Vstup E nebo F edicí
Vstupní pole | Edice | Údaj v počítači |
---|---|---|
_1234.567 | F10.5, E10.5 | 1234.567 |
1.2e3 | F10.0 | 1.2e3 |
1. 3 | F10.0 | 1e3 |
Tabulka 4. Výstup F nebo E edicí
Údaj v počítači | Edice | Výstupní pole |
---|---|---|
1.234 | F5.2 | _1.23 |
0.255 | F5.3 | -.255 |
1.234 | E8.2 | _0.12e+1 |
Tabulka 5. Výstup G edicí
Údaj v počítači | Výstup pro F10.4 | Výstup pro E10.4 | Výstup pro G10.4 |
---|---|---|---|
0.01234567 | ____0.0123 | 0.1235e-01 | 0.1235e-01 |
-0.1234567 | ____-0.123 | -0.1235e+0 | -0.1235___ |
1.234567 | ____1.2346 | 0.1235e+01 | _1.235____ |
V tomto případě má formát tvar
A[w]
kde w udává celkovou šířku řetezce. V případě, že není w uvedeno pak se odvodí délka dat ze skutečné délky řetezce. Proto se může stát, že řetezec není načten celý. Tento formát je nezbytně třeba, pokud chceme číst zznakové údaje které nejsou ohraničené apostrofy.
Tabulka 6. Vstup A edicí
Vstupní pole | Edice | Údaj v počítači |
---|---|---|
Fortran 2000 | A | Fortran 2000 |
Fortran 2000 | A7 | Fortran |
Tabulka 7. Výstup A edicí
Údaj v počítači | Edice | Výstupní pole |
---|---|---|
Fortran 2000 | A | Fortran 2000 |
Fortran 2000 | A9 | Fortran 2 |
short | A10 | short_____ |
Tzv změna měřítka se provede pomocí konverze
kP
kde k udává měřítko. Tento možnost je v podstatě užitečná jen v případě, že chceme vypsat data edicí E tak aby na prvním místě nebyla nula. Například formát 1P,E8.3 pro číslo 1.2 vypíše
write(*,'(1P,E8.3)') 1.2 -> 1.2e+00
místo 0.12e+01.
Na jakoukoli pozici v záznamu se lze dostat přes formátovací značky
T, TR, TL
přičemž T10 posune následující čtení na znak 10 od začátku záznamu, TR10 o 10 znaků doprava a TL10 o 10 znaků doleva.
Předcházející | Domů | Další |
Programové jednotky | Pole |