Přeskočit na obsah

Č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 integer proměnná do které se uloží číslo otevřené jednotky. Tento parametr používáme místo parametru unit.
  • action = act - act je character promě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 integer proměnná která je 0 pokud otevření souboru proběhlo bez chyby
  • status = stat - stat je character promě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 integer a 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 integer detekují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