我一直在网上寻找,但还没有找到任何解决方案。
我正在尝试读取.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