如何修复Fortran运行时错误:文件结束?

时间:2017-11-16 18:43:13

标签: fortran

我正在尝试在Fortran90中读取一个名为“syerasg.txt”的文件。该文本文件包括针对8984个人16年(143 744行)的91个变量(列)的面板数据。这些变量分为7组,这组分为13个小组。我正在尝试使用以下代码读取此文件:

 PROGRAM main
    IMPLICIT NONE

    INTEGER, PARAMETER :: p=8984, tf=16, sem=53, emp=7, gap=13
    INTEGER :: r, t, j, m, g, x, i, IOstatus 
    INTEGER, DIMENSION (p,tf,emp) :: yemp
    INTEGER, DIMENSION (p,tf,emp,gap) :: gaps
    OPEN(UNIT=4, FILE='syearsg.txt',STATUS='old') !start gap years 
DO i=1,p 
    DO t=1,tf
        DO j=1,emp 
            IF (j==1) THEN 
                READ(4,*)(gaps(i,t,j,g),g=1,13)            
            ELSE IF (j==2) THEN
                READ(4,*)(gaps(i,t,j,g-13),g=14,26)
            ELSE IF (j==3) THEN 
                READ(4,*)(gaps(i,t,j,g-26),g=27,39)
            ELSE IF (j==4) THEN 
                READ(4,*)(gaps(i,t,j,g-39),g=40,52)
            ELSE IF (j==5) THEN 
                READ(4,*)(gaps(i,t,j,g-52),g=53,65)
            ELSE IF (j==6) THEN 
                READ(4,*)(gaps(i,t,j,g-65),g=66,78)
            ELSE IF (j==7) THEN 
                READ(4,*)(gaps(i,t,j,g-78),g=79,91)
            END IF 
        END DO    
   END DO
END DO
CLOSE(4)
END PROGRAM main

运行代码时,我收到以下消息:

  

Fortran运行时错误:文件结束

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

您的循环嵌套发出1,006,208(即p*tf*empread个语句。毫不奇怪,程序只运行一个只有143,744行的文件的末尾。 read读取要求读取的值,然后跳到下一行的开头,为下一行read做好准备。

您可以通过摆弄非前进输入来修复程序,即告诉read语句不要跳到下一行的开头。但是不容易这样做。

根据您所写的内容,您应该只发出p*tf read个语句,然后阅读包含91个元素的单行,然后将这些元素作为逻辑分发到gaps需求。

您可能会将代码修改为类似的内容(未经测试且未经过仔细检查)

INTEGER, DIMENSION(91) :: workvec
...    
DO i=1,p 
    DO t=1,tf
       READ(4,*) workvec            
       gaps(i,t,1,1:13) = workvec( 1:13)       
       gaps(i,t,2,1:13) = workvec(14:26)
       ...       
    END DO    
END DO