Vstup/Vystup

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.

Příkazy na manipulaci se soubory

Open

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.

Close

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.

Inquire

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

Endfile

Zapsání značky konec souboru do souboru. Příkaz má tvar:


endfile([unit=]číslo,...)

paraemtry má pouze chybové.

Backspace

Vrácení o jeden záznam vzad. Příkaz má tvar:


backspace([unit=]číslo,...)

paraemtry má pouze chybové.

Rewind

Přetočení souboru na začátek. Příkaz má tvar:


rewind([unit=]číslo,...)

paraemtry má pouze chybové.

Čtení a psaní do souborů

Čtení

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í.

Zápis

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át

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.

Volný formát

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

Formátové konverze

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.

Formátování pro Integer

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í poleEdiceÚdaj v počítači
_1234I51234
_1234I5.11234
_-_34I5-34
_I10
3456I234

Tabulka 2. Výstup I edicí

Údaj v počítačiEdiceVýstupní pole
1234I5_1234
12I5.4_0012
-34I2**
Formátování pro Real

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í poleEdiceÚdaj v počítači
_1234.567F10.5, E10.51234.567
1.2e3F10.01.2e3
1. 3F10.01e3

Tabulka 4. Výstup F nebo E edicí

Údaj v počítačiEdiceVýstupní pole
1.234F5.2_1.23
0.255F5.3-.255
1.234E8.2_0.12e+1

Tabulka 5. Výstup G edicí

Údaj v počítačiVýstup pro F10.4Výstup pro E10.4Výstup pro G10.4
0.01234567____0.01230.1235e-010.1235e-01
-0.1234567____-0.123-0.1235e+0-0.1235___
1.234567____1.23460.1235e+01_1.235____
Formátování pro Character

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í poleEdiceÚdaj v počítači
Fortran 2000AFortran 2000
Fortran 2000A7Fortran

Tabulka 7. Výstup A edicí

Údaj v počítačiEdiceVýstupní pole
Fortran 2000AFortran 2000
Fortran 2000A9Fortran 2
shortA10short_____
Další formátovací možnosti

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.