首页 >

用二进制直接存取方式更新文件时需注意的细节

作者:li913  日期:05-20
来源:Fcode研讨团队
用二进制直接存取方式更新文件时需注意的细节

在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
 
运行结果:


大图
常规|工具|专业|读物|
代码|教学|算法|
首页 >
FortranCoder手机版-导航