Fortran 文件输入输出
Fortran 让您可以从文件读取数据和向文件写入数据。
在上一章中,您已经了解了如何从终端读取数据和向终端写入数据。在本章中,您将学习 Fortran 提供的文件输入和输出功能。
您可以对一个或多个文件进行读写操作。OPEN
、WRITE
、READ
和 CLOSE
语句让您可以实现这一点。
打开和关闭文件
在使用文件之前,您必须打开该文件。open
命令用于打开文件进行读取或写入。命令的最简单形式是:
open (unit = number, file = "name").
然而,公开声明可能具有一般形式:
open (list-of-specifiers)
下表描述了最常用的说明符:
序号 | 说明符 & 描述 |
---|---|
1 | [UNIT=] u u 可以是 9-99 范围内的任何数字,它表示文件,您可以选择任何数字,但程序中的每个打开的文件都必须有一个唯一的数字 |
2 | IOSTAT= ios 它是 I/O 状态标识符,应该是一个整数变量。如果 |
3 | ERR = err 这是一个标签,如果出现任何错误,控件将跳转到该标签。 |
4 | FILE = fname 文件名,字符串。 |
5 | STATUS = sta 它显示了文件的先前状态。一个字符串,可以有 3 个值之一 NEW、OLD 或 SCRATCH。当关闭或程序结束时,会创建并删除一个草稿文件。 |
6 | ACCESS = acc 这是文件访问模式。可以有两个值中的任何一个,SEQUENTIAL 或 DIRECT。默认设置为 SEQUENTIAL。 |
7 | FORM = frm 它给出了文件的格式状态。可以有 FORMATTED 或 UNFORMATED 两个值中的任何一个。默认设置为 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