Čtení a zápis do souboru
Zatím jsme používali jako výstup obrazovku a jako vstup klávesnici. Běžnější je používat pro načítání a vypisování dat externí soubory.
práce se soubory
Dříve něz můžeme číst nebo psát do soubrotu musíme jej nejdříve otevřít nebo vytvořit nebo zjistit zda existuje. K otevření souboru slouží příkaz open.
    open([unit=]un, file=jmenoSouboru [, options])
    					
Jako un označujeme jednotku ve smyslu označení relace se kterou pracujeme. Volitelné parametry (options) mohou být
- newunit = un- un je- integerproměnná do které se uloží číslo otevřené jednotky. Tento parametr používáme místo parametru unit.
- action = act- act je- characterproměnná, která nabývá hodnot buď ‘read’ (soubor bude pouze pro čtení), nebo ‘write’ (do souboru lze pouze zapisovat), nebo ‘readwrite’ (do souboru lze zapisoval a lze z něj i číst).
- iostat = ios- ios je- integerproměnná která je 0 pokud otevření souboru proběhlo bez chyby
- status = stat- stat je- characterproměná která můžeme nabývat hodnot -- 'old'(soubor musí již existovat než se jej pokusíme otevřít),- new(soubor nesmí existovat před pokusem o otevření),- 'replace'(pokud soubor neexistuje bude vytvořen, pokud existuje bude přepsán),- 'scratch'nebo- 'unknown'(výchozí nastavení, závisí na systému, ale měl by se chovat podobně jako- replace).
Kromě těchto volitelných parametrů existují další. Případné zájemce odkazuji na manuál kompilátoru,
Soubor můžeme zavřít pomocí příkazu close(_un_).
Pro zjištění stavu souboru nebo relace existuje funkce
    inquire([unit=]un, options)
nebo
    inquire(file=jmenoSouboru, options)
    						
Volitelné parametry jsou např.
- iostat = ios- stejné jako u- open
- exist = lex- lex je- logical-- .true.pokud soubor existuje
- opened = lop- lop je- logical- vrátí- .true.pokud je soubor otevřený
- number = num- num je- integera odpovídá číslu jednotky spojeného se souborem nebo -1 pokud soubor není připojen
- named = isnamed- isnamed získá jméno souboru, který je spojen s jednotkou
čtení a zápis dat
Příkazy write(*,*) a read(*,*) již známe. Ovšem jejich obecný zápis vypadá takto
    write([unit=]iu, options) formát [, výrazy]
    read([unit=]iu, options) formát [, výrazy]
    						
Kde volitelné parametry mohou být
- fmt = ifmt- ifmt je odkaz na formát
- iostat = ios- ios je- integerdetekující chybu - pokud je roven 0 je vše v pořádku
Všimněme si, že tam kde by se měla specifikovat jednotka jsem do teď používali jen *. Tím jsme říkali aby se vše tisklo popř. četlo s výchozích zařízeních. To jsou běžně právě obrazovka a klávesnice. Pokud doplníme jednotku otevřeného souboru, můžeme do něj zapisovat pomocí write a číst pomocí read.
    program priklad_33
    implicit none
      
      integer :: un ,ios,id_data
      real :: hodnota_data, prumer
      logical :: lex
      character(len=100) :: hlavicka
      
      inquire(file="data.txt",exist=lex) ! otestujeme zda soubor existuje
      if(.not. lex) stop "soubor neexistuje" ! zastavime program pokud neexistuje
      
      open(newunit=un, file="data.txt", status="old", iostat=ios) !otevreme data.txt
      if(ios /= 0) stop "chyba pri otevirani souboru"
      
      read(un,*) hlavicka ! nasteme hlavicku souboru
      prumer = 0.
      do
        read(un,*,iostat=ios) id_data, hodnota_data ! cteme data ze souboru
        if(ios /= 0) exit ! opustime cyklus pokud jsme na konci souboru
        prumer = prumer + hodnota_data
      enddo
      
      prumer = prumer / id_data
      
      close(un)
      
      open(1,file="vysledek.txt")
      write(1,*) "prumer = ", prumer
      close(1)
      
    end program    					
Příklad souboru data.txt:
    id        hodnota
        1       -3.43278
        2       -0.86679
        3        2.27433
        4        2.00323
        5        3.92815
        6       -1.54608
        7       -4.87147
        8        3.87419
        9       -4.84836
       10       -3.46638
       11        0.98019
       12        2.65459
       13       -2.57724
       14        3.36523
       15       -4.01515
       16       -3.74033
       17       -2.05035
       18        0.08578
       19        1.20830
       20        4.94699