Fortran - 檔案輸入輸出



Fortran允許您從檔案讀取資料,並將資料寫入檔案。

在上一章中,您已經瞭解瞭如何從終端讀取資料以及向終端寫入資料。本章將學習Fortran提供的檔案輸入輸出功能。

您可以讀取和寫入一個或多個檔案。OPEN、WRITE、READ和CLOSE語句允許您實現此目的。

開啟和關閉檔案

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

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

但是,open語句可能具有通用形式:

open (list-of-specifiers)

下表描述了最常用的說明符:

序號 說明符和描述
1

[UNIT=] u

單元號 u 可以是9-99範圍內的任何數字,它表示檔案,您可以選擇任何數字,但程式中每個開啟的檔案必須具有唯一的編號。

2

IOSTAT= ios

它是I/O狀態識別符號,應為整型變數。如果open語句成功,則返回的ios值為零,否則為非零值。

3

ERR = err

這是一個標籤,在發生任何錯誤時,控制權將跳轉到該標籤。

4

FILE = fname

檔名,一個字元字串。

5

STATUS = sta

它顯示檔案的先前狀態。一個字元字串,可以具有三個值之一:NEW、OLD或SCRATCH。臨時檔案在關閉或程式結束時建立並刪除。

6

ACCESS = acc

它是檔案訪問模式。可以具有兩個值之一:SEQUENTIAL或DIRECT。預設為SEQUENTIAL。

7

FORM = frm

它給出檔案的格式狀態。可以具有兩個值之一:FORMATTED或UNFORMATTED。預設為UNFORMATTED。

8

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和write語句分別用於從檔案讀取和寫入檔案。

它們具有以下語法:

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    
廣告
© . All rights reserved.