位置:首页 > > Fortran文件输入输出

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