1

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

我正在尝试从 .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 runtime error: End of file" 。然而,该文件仅在几千行后结束。

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

4

1 回答 1

4

这是我的编译器所说的:

> 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到 unit77但随后尝试从 unit 读取1

如果您的编译器在语句中支持 Fortran 2008NEWUNIT=说明符,OPEN那么我建议您使用它,如下所示(并且美化了)

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
于 2015-03-26T17:35:39.363 回答