首页 > 教程 > 正文

阅读排行

用二进制直接存取方式更新文件时需注意的细节
2014-05-20 16:55:00   来源:Fcode研讨团队   评论:0 点击:

本文介绍了在用二进制直接存取读写文件时的一些注意事项。

用二进制直接存取方式更新文件时需注意的细节
 
在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
 
运行结果:

\ 

相关热词搜索:二进制 直接存取

上一篇:Intent属性对结构体中动态数组的影响
下一篇:关于 encompassing scoping unit Error 错误

分享到: 收藏