我一直在网上看,但我还没有找到任何解决方案。
我试图从.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
但是,当我运行此代码时,我得到了#34; Fortran运行时错误:文件结束" 。该文件仅在几千行后结束。
我做错了什么?为什么程序认为文件只在第一行结束?
答案 0 :(得分: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
与单位77
相关联,然后尝试从单位1
进行阅读。
如果你的编译器支持NEWUNIT=
语句中的Fortran 2008 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