Fortran查询返回内部文件

时间:2018-10-27 15:46:51

标签: fortran gfortran

我的fortran程序遇到意外情况。 我想在文本文件中删除一些数据。由于某些原因,我创建了一个用于处理此文件的类型。

因此,我使用以下命令打开文件(其中f是我的文件类型对象):

open(newunit    = f%unit,          &
     file       = trim(adjustl(f%name)), &
     form       = 'FORMATTED',      & 
     access     = 'STREAM',         & 
     action     = 'WRITE',          &
     status     = 'REPLACE',        &
     iostat     = ios)
if(ios /= 0) print '("Problem creating file")', trim(f%name)

然后我写这样的东西:

write(unit=f%unit,fmt='(100A)') "#Header"

完成后,我想关闭文件。为此,我调用子例程:

subroutine close_file_ascii(f)    
  implicit none
  class(my_file_type) intent(in) :: f
  logical :: file_opened, file_exist
  integer :: ios

  inquire(unit=f%unit, exist=file_exist, opened=file_opened) !, iostat=ios)
  print *,'file_exist:', file_exist, 'file_opened:', file_opened, 'ios:', ios
  if ((file_opened) .and. (file_exist)) then
     close(unit=f%unit)
  else
    print *,"[WARNING]"
  end if
end subroutine close_file_ascii

我的问题是在最后一个子例程中。在Windows上运行程序时,出现以下错误:

Fortran runtime error: Inquire statement identifies an internal file
Error termination. Backtrace

因此,我尝试创建MWE来了解问题,但是所有这些都可以正常工作。因此无法真正隔离问题。同样奇怪的是,当我在Linux上使用gfortran进行编译和执行时,没有问题,但是在Windows上执行此操作时,出现了先前的错误。 (我使用的是gfortran版本7.3.0 x86_64-posix-sjlj-rev0,由MinGW-W64构建的Windows上的编译器)

我已经通过在close子例程中取消注释查询行的末尾来解决此问题,并且一切似乎都正常进行。我得到以下打印:

file_exist: T file_opened: T ios:        5018

但是我想了解发生了什么。那么,什么会造成这种内部文件错误(而该文件不应该是内部文件却应该是外部文件)呢?我的解决方法可能有害吗?是虫子吗?有没有更好的方法安全地关闭打开的文件?有什么办法可以解决问题吗?

编辑

根据roygvib的评论,以下测试似乎可以重现该问题:

program bug
  implicit none
  integer          :: i
  character(len=1) :: s
  write (s,'(i1)') 0
  open(newUnit=i,file='bug.txt',status='unknown')
  inquire(unit=i)
end program bug

1 个答案:

答案 0 :(得分:1)

gfortran 8.1的更新解决了该问题。