Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fortran inquire return internal file

I have a situation unexpected with my fortran program. I want to drop some data in a text file. For some reasons, I created a type to deal with this file.

Therefore, I open a file with the commands (where f is my file type object):

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)

Then I write stuff like this:

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

And when it is done, I want to close the file. To do this, I call the subroutine:

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

My problem is in this last subroutine. When I run the program on windows, I get the following error:

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

Therefore, I tried to create MWE to understand the problem, but all of them where working well. So couldn't really isolate the problem. Also a strange thing is that when I compile and execute with gfortran on my linux there is no problem, but when I do so on my windows I get the previous error. ( I compile on windows with gfortran version 7.3.0 x86_64-posix-sjlj-rev0, Built by MinGW-W64 )

I already work-around this problem by uncommenting the end of inquire line in the close subroutine, and everything seems to work fine. And I get the following print:

file_exist: T file_opened: T ios:        5018

But I would to understand what is going on. So what could create such internal file error (while the file should not be internal but external)? Is my workaround could be harmful ? Is it a bug ? Is there a better way to close safely an opened file? Any ideas to isolate the problem ?

EDIT

From roygvib's comment, the following test seems to replicate the problem:

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
like image 951
R. N Avatar asked Mar 11 '26 04:03

R. N


1 Answers

The update to gfortran 8.1 solved the problem.

like image 158
R. N Avatar answered Mar 14 '26 09:03

R. N



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!