Fortran - 文件输入输出

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

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

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

打开和关闭文件

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

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

但是,open 语句可能具有一般形式 −

open (list-of-specifiers)

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

Sr.No 说明符 & 描述
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

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

文件打开后,通过读写语句对其进行访问。 完成后,应使用 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  
   
   ! 将数据输出到文件中
   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  
   
   ! 将数据输出到文件中
   open(1, file = 'data1.dat', status='new')  
   do i = 1,100  
      write(1,*) x(i), y(i)   
   end do  
   close(1) 

   ! 打开文件进行读取
   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