Č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 jeinteger
proměnná do které se uloží číslo otevřené jednotky. Tento parametr používáme místo parametru unit.action = act
- act jecharacter
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 jeinteger
proměnná která je 0 pokud otevření souboru proběhlo bez chybystatus = stat
- stat jecharacter
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ě jakoreplace
).
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 uopen
exist = lex
- lex jelogical
-.true.
pokud soubor existujeopened = lop
- lop jelogical
- vrátí.true.
pokud je soubor otevřenýnumber = num
- num jeinteger
a odpovídá číslu jednotky spojeného se souborem nebo -1 pokud soubor není připojennamed = 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átiostat = ios
- ios jeinteger
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