我正在尝试在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运行时错误:文件结束
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
您的循环嵌套发出1,006,208
(即p*tf*emp
)read
个语句。毫不奇怪,程序只运行一个只有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