Fortran檔案輸入輸出


Fortran語言可以讀取資料,並將資料寫入到檔案中。

在最後一章中,已經看到了如何讀取資料和寫入資料到終端。在本章中,將學習用Fortran語言提供檔案的輸入和輸出功能。

可以讀取和寫入到一個或多個檔案。OPEN, WRITE, READ 和 CLOSE語句可以實現這一目標。

開啟和關閉檔案

使用檔案之前,必須開啟該檔案。 open命令用於開啟檔案進行讀取或寫入。命令的最簡單的形式是:

open (unit = number, file = "name").

然而,open 語句的一般形式:

open (list-of-specifiers)

下表介紹了最常用的修飾符:

修辭符 描述
[UNIT=] u 單元數u可以是任何數量範圍內9-99,它表明該檔案,可以選擇任何號碼,但在程式中每一個開啟的檔案必須有一個唯一的數位
IOSTAT= ios 它是在I/O狀態識別符號和應為整數的變數。如果開啟的語句是成功,則返回IOS值為零,否則為一個非零值。
ERR = err 它是一個標籤到該控制跳以防有錯誤。
FILE = fname 檔案名,一個字串。
STATUS = sta 它示出了該檔案的先前狀態。一個字串,可以有三個值NEW, OLD 或 SCRATCH。一個臨時檔案被建立和刪除,當關閉或程式結束。
ACCESS = acc 它是該檔案的存取模式。可以有兩個值SEQUENTIAL 或 DIRECT。預設值是SEQUENTIAL。
FORM= frm 它給該檔案的格式的狀態。可以有FORMATTED 或UNFORMATTED兩個值。預設值是UNFORMATTED
RECL = rl 它指定的每個記錄中的一個直接存取檔案的長度。

該檔案已被開啟後,它由read 和 write語句存取。一旦完成,就應該使用close語句關閉。

close語句的語法如下:

close ([UNIT=]u[,IOSTAT=ios,ERR=err,STATUS=sta])

請注意,括號中的引數是可選的。

範例

這個例子演示了寫一些資料到一個新的開啟檔案。

program outputdata   
implicit none

   real, dimension(100) :: x, y  
   real, dimension(100) :: p, q
   integer :: i  
   
   ! data  
   do i=1,100  
      x(i) = i * 0.1 
      y(i) = sin(x(i)) * (1-cos(x(i)/3.0))  
   end do  
   
   ! output data into a file 
   open(1, file='data1.dat', status='new')  
   do i=1,100  
      write(1,*) x(i), y(i)   
   end do  
   
   close(1) 
   
end program outputdata

當上述程式碼被編譯和執行時,它建立檔案data1.dat和x和y陣列值寫入到其中。然後關閉該檔案。

讀取和寫入檔案

讀取和寫入的語句分別用於讀取和分別寫入到檔案中。

它們有以下語法:

read ([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
write([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)

大部分的修飾符的已在上表中討論。

END= S說明是程式跳轉,當它到達檔案結束,宣告標籤。

範例

這個例子演示了讀取和寫入到檔案。

在這個程式中,從檔案中讀取,在最後一個例子建立data1.dat,並在螢幕上顯示出來。

program outputdata   
implicit none   

   real, dimension(100) :: x, y  
   real, dimension(100) :: p, q
   integer :: i  
   
   ! data  
   do i=1,100  
      x(i) = i * 0.1 
      y(i) = sin(x(i)) * (1-cos(x(i)/3.0))  
   end do  
   
   ! output data into a file 
   open(1, file='data1.dat', status='new')  
   do i=1,100  
      write(1,*) x(i), y(i)   
   end do  
   close(1) 

   ! opening the file for reading
   open (2, file='data1.dat', status='old')

   do i=1,100  
      read(2,*) p(i), q(i)
   end do 
   
   close(2)
   
   do i=1,100  
      write(*,*) p(i), q(i)
   end do 
   
end program outputdata

讓我們編譯和執行上面的程式,這將產生以下結果:

0.100000001  5.54589933E-05
0.200000003  4.41325130E-04
0.300000012  1.47636665E-03
0.400000006  3.45637114E-03
0.500000000  6.64328877E-03
0.600000024  1.12552457E-02
0.699999988  1.74576249E-02
0.800000012  2.53552198E-02
0.900000036  3.49861123E-02
1.00000000   4.63171229E-02
1.10000002   5.92407547E-02
1.20000005   7.35742599E-02
1.30000007   8.90605897E-02
1.39999998   0.105371222    
1.50000000   0.122110792    
1.60000002   0.138823599    
1.70000005   0.155002072    
1.80000007   0.170096487    
1.89999998   0.183526158    
2.00000000   0.194692180    
2.10000014   0.202990443    
2.20000005   0.207826138    
2.29999995   0.208628103    
2.40000010   0.204863414    
2.50000000   0.196052119    
2.60000014   0.181780845    
2.70000005   0.161716297    
2.79999995   0.135617107    
2.90000010   0.103344671    
3.00000000   6.48725405E-02
3.10000014   2.02930309E-02
3.20000005  -3.01767997E-02
3.29999995  -8.61928314E-02
3.40000010  -0.147283033    
3.50000000  -0.212848678    
3.60000014  -0.282169819    
3.70000005  -0.354410470    
3.79999995  -0.428629100    
3.90000010  -0.503789663    
4.00000000  -0.578774154    
4.09999990  -0.652400017    
4.20000029  -0.723436713    
4.30000019  -0.790623367    
4.40000010  -0.852691114    
4.50000000  -0.908382416    
4.59999990  -0.956472993    
4.70000029  -0.995793998    
4.80000019  -1.02525222    
4.90000010  -1.04385209    
5.00000000  -1.05071592    
5.09999990  -1.04510069    
5.20000029  -1.02641726    
5.30000019  -0.994243503    
5.40000010  -0.948338211    
5.50000000  -0.888650239    
5.59999990  -0.815326691    
5.70000029  -0.728716135    
5.80000019  -0.629372001    
5.90000010  -0.518047631    
6.00000000  -0.395693362    
6.09999990  -0.263447165    
6.20000029  -0.122622721    
6.30000019   2.53026206E-02
6.40000010   0.178709000    
6.50000000   0.335851669    
6.59999990   0.494883657    
6.70000029   0.653881252    
6.80000019   0.810866773    
6.90000010   0.963840425    
7.00000000   1.11080539    
7.09999990   1.24979746    
7.20000029   1.37891412    
7.30000019   1.49633956    
7.40000010   1.60037732    
7.50000000   1.68947268    
7.59999990   1.76223695    
7.70000029   1.81747139    
7.80000019   1.85418403    
7.90000010   1.87160957    
8.00000000   1.86922085    
8.10000038   1.84674001    
8.19999981   1.80414569    
8.30000019   1.74167395    
8.40000057   1.65982044    
8.50000000   1.55933595    
8.60000038   1.44121361    
8.69999981   1.30668485    
8.80000019   1.15719533    
8.90000057   0.994394958    
9.00000000   0.820112705    
9.10000038   0.636327863    
9.19999981   0.445154816    
9.30000019   0.248800844    
9.40000057   4.95488606E-02
9.50000000  -0.150278628    
9.60000038  -0.348357052    
9.69999981  -0.542378068    
9.80000019  -0.730095863    
9.90000057  -0.909344316    
10.0000000  -1.07807255