在ivf 中,二进制直接存取方式有两种表述:
1、open(11,file='1.dat',form='binary',access='direct',recl=4)
2、open(11,file='1.dat',access='stream')
前者为vf扩展,后者为Fortran90标准,因此推荐使用后者。
用二进制直接存取方式对已存在文件进行写操作时,如果当前文件指针之后还有数据,这部分数据将会被保留(顺序读写方式会删除该数据体)。当文件中少量数据需要修改时,这一特性非常实用。
现在考虑另一种情况:我们运行程序时生成了一个40字节的二进制文件(1.dat),由于某种原因,需要修改部分参数,重新生成这个文件,但需输出的有用信息仅20字节。由于前面所说的特性,最终得到的文件依然是40字节:前20字节得到更新,后20字节原样保留。下面的例子演示了这一情况:
program www_fcode_cn implicit none integer :: i, j, idat(10)=(/(i,i=1,10)/) open(11,file='1.dat',access='stream') write(11) -idat(1:10) ! create a file with 40 bytes close(11) open(11,file='1.dat',access='stream') write(11) idat(1:5) ! output 20 bytes close(11) open(11,file='1.dat',access='stream') do read(11,iostat=j) i if(j/=0) exit print*,i end do close(11) call system("pause") end program www_fcode_cn
输出结果如图:
显然,文件中后20个字节的内容是原文件遗留的,并不是我们想要的。为解决这个问题,我们提供两种方案:
1、删除原来遗留的文件。下面两种方法均可删除文件:
(1)call system('del 1.dat')
(2)open(11,file='1.dat')
close(11,status='delete')
2、在文件输出完毕之后,关闭通道之前,使用文件尾 endfile
open(11,file='1.dat',access='stream')
write(11) idat(1:5) ! output 20 bytes
endfile(11)
close(11)
修改后代码:
program www_fcode_cn implicit none integer :: i, j, idat(10)=(/(i,i=1,10)/) open(11,file='1.dat',access='stream') write(11) -idat(1:10) ! create a file with 40 bytes close(11) !open(11,file='1.dat') !close(11,status='delete') !call system('del 1.dat') open(11,file='1.dat',access='stream') write(11) idat(1:5) ! output 20 bytes endfile(11) ! end-of-file close(11) open(11,file='1.dat',access='stream') do read(11,iostat=j) i if(j/=0) exit print*,i end do close(11) call system("pause") end program www_fcode_cn
运行结果: