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.