我的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
答案 0 :(得分:1)
gfortran 8.1的更新解决了该问题。