FORTRAN中出现意外的文件结尾



我一直在网上寻找,但还没有找到任何解决方案。

我正在尝试读取.neu(中性格式)文件,这是一种由Gambit软件生成的文件,包含有关CFD计算中使用的网格的信息。

文件如下:

        CONTROL INFO 2.4.6
** GAMBIT NEUTRAL FILE
S1
PROGRAM:                Gambit     VERSION:  2.4.6
     NUMNP     NELEM     NGRPS    NBSETS     NDFCD     NDFVL
    120847    240234         1         1         2         2
ENDOFSECTION
   NODAL COORDINATES 2.4.6
         1  0.00000000000e+000  2.50000000000e+001
         2  0.00000000000e+000  0.00000000000e+000
         3  0.00000000000e+000  2.49000000000e+001
         4  0.00000000000e+000  2.48000000000e+001
        ... 

我正在试着阅读下面的一行:

120847    240234         1         1         2         2

这是我的代码:

PROGRAM readGAMBIT
    INTEGER, DIMENSION(6) :: mdata
    LOGICAL :: lexist
    INTEGER :: i
    INQUIRE (FILE="mesh.neu", EXIST=lexist)
    IF (.not.lexist) THEN
        STOP "**** mesh.neu does not exist ****"
    ENDIF
    OPEN(77,file="mesh.neu")
    DO i = 1, 6
        READ(1,*) ! Ignores the 1st 6 lines
    ENDDO
    READ(1,*) mdata(1), mdata(2), mdata(3), mdata(4), mdata(5), mdata(6)
    PRINT*, mdata(1)
    CLOSE(77)
END PROGRAM readGAMBIT

但是,当我运行此代码时,我会得到"Fortran运行时错误:文件结尾"。然而,该文件只在几千行之后结束。

我做错了什么?为什么程序认为文件只在第一行结束?

以下是我的编译器所说的:

> nagfor -C=all -C=undefined readGAMBIT.f90 && ./a.out 
....
Runtime Error: End of file on unit 1
Program terminated by I/O error on unit 1 (File="fort.1",Formatted,Sequential)
Abort (core dumped)

很明显,您将mesh.neu与单元77关联,但随后尝试从单元1读取。

如果您的编译器在OPEN语句上支持Fortran 2008 NEWUNIT=说明符,那么我建议您使用它,如下所示(并经过修饰)

Program readgambit
  Integer, Dimension (6) :: mdata
  Logical :: lexist
  Integer :: i, newunit
  Inquire (File='mesh.neu', Exist=lexist)
  If (.Not. lexist) Then
    Stop '**** mesh.neu does not exist ****'
  End If
  Open (File='mesh.neu', Newunit=newunit)
  Do i = 1, 6
    Read (newunit, *) ! Ignores the 1st 6 lines
  End Do
  Read (newunit, *) mdata(1), mdata(2), mdata(3), mdata(4), mdata(5), mdata(6)
  Print *, mdata(1)
  Close (newunit)
End Program

对我来说是

> nagfor -C=all -C=undefined readGAMBIT.f90 && ./a.out
...
 120847