文件输入输出( File Input Output)
Fortran允许您从文件中读取数据并将数据写入文件。
在上一章中,您已经了解了如何从终端读取数据和向终端写入数据。 在本章中,您将学习Fortran提供的文件输入和输出功能。
您可以读取和写入一个或多个文件。 OPEN,WRITE,READ和CLOSE语句允许您实现此目的。
打开和关闭文件 (Opening and Closing Files)
在使用文件之前,您必须打开该文件。 open命令用于打开文件进行读写。 最简单的命令形式是 -
open (unit = number, file = "name").
但是,公开声明可能有一般形式 -
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])
请注意括号中的参数是可选的。
Example
此示例演示如何打开新文件以将某些数据写入文件。
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说明符是一个语句标签,程序在到达文件结尾时跳转。
Example
此示例演示如何读取和写入文件。
在这个程序中,我们从文件中读取,我们在最后一个例子中创建了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