为什么直接访问 I/O 无法正确使用 Intel Visual Fortran
Why direct access I/O works incorrectly with Intel Visual Fortran
这个节目
program test
real a(10)
open(1, file='f1',access='direct', recl=20)
do i=1, 10
a(i) = i-1
end do
write(1, rec=1)(a(i),i=1,5)
write(1, rec=2)(a(i),i=6,10)
close(1)
open(1, file='f1',access='direct',recl=8)
read(1, rec=4)(a(i),i =5,9,4)
print*,a
end
在可视 Fortran 中工作不正确(不正确):
0.0000000E+00 1.000000 2.000000 3.000000 9.000000
5.000000 6.000000 7.000000 0.0000000E+00 9.000000
WATCOM 结果(正确):
0.0000000 1.0000000 2.0000000 3.0000000 6.0000000
5.0000000 6.0000000 7.0000000 7.0000000 9.0000000
为什么?
Visual Fortran中RECL的默认单位长度是一个字(4bytes)。如果您使用选项 'Use bytes as RECL= unit for unformatted file' (/assume:byterecl) 进行编译,您将得到您期望的结果。
在编写代码时,您不需要知道记录的长度究竟是多少,无论单位是多少。设置 recl=20
或 recl=5
并取决于编译器的确切行为和确切的 real
大小是未来问题的一个秘诀。
无论使用哪种单位,您都应该向编译器询问记录的大小:
integer :: recl5, recl2
inquire(iolength=recl5) (a(i),i=1,5)
open(1, file='f1',access='direct', recl=recl5)
...
inquire(iolength=recl2) (a(i),i =5,9,4)
open(1, file='f1',access='direct',recl=recl2)
注意:在 Fortran 90 中,使用子数组表示法可能会更短。
注意 2:对于某些编译器,您的程序将永远无法运行,因为允许编译器在文件中使用记录结束标记,并且您必须始终使用相同的 recl
打开它。但这并不常见。
这个节目
program test
real a(10)
open(1, file='f1',access='direct', recl=20)
do i=1, 10
a(i) = i-1
end do
write(1, rec=1)(a(i),i=1,5)
write(1, rec=2)(a(i),i=6,10)
close(1)
open(1, file='f1',access='direct',recl=8)
read(1, rec=4)(a(i),i =5,9,4)
print*,a
end
在可视 Fortran 中工作不正确(不正确):
0.0000000E+00 1.000000 2.000000 3.000000 9.000000
5.000000 6.000000 7.000000 0.0000000E+00 9.000000
WATCOM 结果(正确):
0.0000000 1.0000000 2.0000000 3.0000000 6.0000000
5.0000000 6.0000000 7.0000000 7.0000000 9.0000000
为什么?
Visual Fortran中RECL的默认单位长度是一个字(4bytes)。如果您使用选项 'Use bytes as RECL= unit for unformatted file' (/assume:byterecl) 进行编译,您将得到您期望的结果。
在编写代码时,您不需要知道记录的长度究竟是多少,无论单位是多少。设置 recl=20
或 recl=5
并取决于编译器的确切行为和确切的 real
大小是未来问题的一个秘诀。
无论使用哪种单位,您都应该向编译器询问记录的大小:
integer :: recl5, recl2
inquire(iolength=recl5) (a(i),i=1,5)
open(1, file='f1',access='direct', recl=recl5)
...
inquire(iolength=recl2) (a(i),i =5,9,4)
open(1, file='f1',access='direct',recl=recl2)
注意:在 Fortran 90 中,使用子数组表示法可能会更短。
注意 2:对于某些编译器,您的程序将永远无法运行,因为允许编译器在文件中使用记录结束标记,并且您必须始终使用相同的 recl
打开它。但这并不常见。