Fortran - 文件输入输出


Fortran 允许您从文件读取数据并将数据写入文件。

在上一章中,您了解了如何从终端读取数据以及向终端写入数据。在本章中,您将学习 Fortran 提供的文件输入和输出功能。

您可以读取和写入一个或多个文件。OPEN、WRITE、READ 和 CLOSE 语句可以让您实现这一点。

打开和关闭文件

在使用文件之前,您必须打开该文件。open命令用于打开文件进行读或写。该命令最简单的形式是 -

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

然而,公开声明可能具有一般形式 -

open (list-of-specifiers)

下表描述了最常用的说明符 -

先生编号 说明符和描述
1

[单位=]你

单元号 u 可以是 9-99 范围内的任意数字,它表示文件,您可以选择任何数字,但程序中每个打开的文件必须有唯一的编号

2

IOSTAT=ios

它是 I/O 状态标识符,应该是一个整型变量。如果 open 语句成功,则返回的 ios 值为零,否则为非零值。

3

错误=错误

这是一个标签,如果出现任何错误,控件将跳转到该标签。

4

文件=文件名

文件名,字符串。

5

状态 = 斯塔

它显示文件的先前状态。一个字符串,可以具有 NEW、OLD 或 SCRATCH 三个值之一。关闭或程序结束时会创建并删除临时文件。

6

访问权限 = ACC

这是文件访问模式。可以有两个值之一:SEQUENTIAL 或 DIRECT。默认为顺序。

7

表格=frm

它给出了文件的格式化状态。可以具有 FORMATTED 或 UNFORMATTED 两个值之一。默认为未格式化

8

RECL = RL

它指定直接访问文件中每条记录的长度。

文件打开后,可以通过读和写语句对其进行访问。完成后,应使用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