读取输入文件时 Fortran 打印行号
Fortran Print Line Number While Reading Input File
我收到来自输入文件的格式错误,我想确定格式错误发生在输入文件中的什么位置。
我的问题是:有没有办法打印我的 fortran 代码中发生错误的输入文件的行号?
这是我得到的错误:
fmt: read unexpected character
apparent state: unit 4 named input_file
last format: (6(I3,X,F7.2,X,I2,X))
lately reading sequential formatted external IO
这意味着代码被挂在我的输入文件中与上述格式不符的某行。
这是我的代码中 Fortran 正在读取输入文件的部分:
DO 20 K = 1,NUMB
READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
DO 30 J = 1,6
L = L+1
ISTO(L,N) = NSTN(J)
SECT(L,N) = TT(J)
KWV(L,N) = IKPS(J)
30 CONTINUE
20 CONTINUE
KOBS(N) = NSTM
10 CONTINUE
100 FORMAT(5(I2,X),F6.2,X,F5.2,X,F7.3,X,F6.3,X,F8.3,X,F6.3,
& X,F6.2,X,F5.2,X,I3,X,F4.1,X,F5.2,X,F7.3)
200 FORMAT(6(I3,X,F7.2,X,I2,X))
RETURN
END
我想在上面的代码中加一行来标识代码正在读取的当前行,这样当它被挂断时,我就会知道哪一行包含错误。谢谢你的帮助。
这是我尝试过的方法,它给了我另一个错误:
c READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
READ(4,200)line
READ(line,*,iostat=ios) (NSTN(J),TT(J),IKPS(J),J=1,6)
IF(ios>0)THEN
WRITE(*,*)'Error Reading Line',line
STOP
ENDIF
INTEGER ios
CHARACTER*(200)line
添加一个显式循环来读取您的数据,例如:
DO 20 J = 1,6
write (*,*) 'Reading line = ', J
READ(4,100) NSTN(J),TT(J),IKPS(J)
20 CONTINUE
100 FORMAT(I3,X,F7.2,X,I2,X)
这样,由于读取循环中的写入语句,您将准确知道它停止的位置。请注意,我添加了两个新标签,20 用于控制新循环,100 用于新格式语句。相应地进行调整。
==============
DO 20 K = 1,NUMB
WRITE (*,*) 'Reading line = ', K
READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
DO 30 J = 1,6
L = L+1
ISTO(L,N) = NSTN(J)
SECT(L,N) = TT(J)
KWV(L,N) = IKPS(J)
30 CONTINUE
20 CONTINUE
KOBS(N) = NSTM
200 FORMAT(6(I3,X,F7.2,X,I2,X))
RETURN
END
像
这样的读语句
READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
输入错误导致程序(错误)终止。无法控制这一终止,尤其是无法进行进一步处理。
有两种方法可以避免这种终止,并且都涉及在读取语句中使用额外的说明符。一个是 iostat=
,另一个是 err=
。如果存在其中任何一个,则错误不会导致终止。
与iostat
(对于整数istat
):
READ(4,200,iostat=istat) (NSTN(J),TT(J),IKPS(J),J=1,6)
然后在错误情况下,istat
将具有(取决于处理器的)正值。当(且仅当)没有错误时,它将为零。
使用 err
(对于某些标签,例如 991
):
READ(4,200,err=991) (NSTN(J),TT(J),IKPS(J),J=1,6)
把所有这些放在一起,让我们想象一个外循环
DO 100 LINE=1,91959
READ(4,200,IOSTAT=ISTAT) (NSTN(J),TT(J),IKPS(J),J=1,6)
IF (ISTAT.NE.0) THEN
PRINT *, 'It went wrong on line', LINE
STOP
END IF
...
100 CONTINUE
或
DO 100 LINE=1,91959
READ(4,200,ERR=991) (NSTN(J),TT(J),IKPS(J),J=1,6)
...
100 CONTINUE
...
991 PRINT *, 'It went wrong on line', LINE
STOP
[我无法让自己像 1980 年那样编写代码。]
我收到来自输入文件的格式错误,我想确定格式错误发生在输入文件中的什么位置。
我的问题是:有没有办法打印我的 fortran 代码中发生错误的输入文件的行号?
这是我得到的错误:
fmt: read unexpected character
apparent state: unit 4 named input_file
last format: (6(I3,X,F7.2,X,I2,X))
lately reading sequential formatted external IO
这意味着代码被挂在我的输入文件中与上述格式不符的某行。
这是我的代码中 Fortran 正在读取输入文件的部分:
DO 20 K = 1,NUMB
READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
DO 30 J = 1,6
L = L+1
ISTO(L,N) = NSTN(J)
SECT(L,N) = TT(J)
KWV(L,N) = IKPS(J)
30 CONTINUE
20 CONTINUE
KOBS(N) = NSTM
10 CONTINUE
100 FORMAT(5(I2,X),F6.2,X,F5.2,X,F7.3,X,F6.3,X,F8.3,X,F6.3,
& X,F6.2,X,F5.2,X,I3,X,F4.1,X,F5.2,X,F7.3)
200 FORMAT(6(I3,X,F7.2,X,I2,X))
RETURN
END
我想在上面的代码中加一行来标识代码正在读取的当前行,这样当它被挂断时,我就会知道哪一行包含错误。谢谢你的帮助。
这是我尝试过的方法,它给了我另一个错误:
c READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
READ(4,200)line
READ(line,*,iostat=ios) (NSTN(J),TT(J),IKPS(J),J=1,6)
IF(ios>0)THEN
WRITE(*,*)'Error Reading Line',line
STOP
ENDIF
INTEGER ios
CHARACTER*(200)line
添加一个显式循环来读取您的数据,例如:
DO 20 J = 1,6
write (*,*) 'Reading line = ', J
READ(4,100) NSTN(J),TT(J),IKPS(J)
20 CONTINUE
100 FORMAT(I3,X,F7.2,X,I2,X)
这样,由于读取循环中的写入语句,您将准确知道它停止的位置。请注意,我添加了两个新标签,20 用于控制新循环,100 用于新格式语句。相应地进行调整。
==============
DO 20 K = 1,NUMB
WRITE (*,*) 'Reading line = ', K
READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
DO 30 J = 1,6
L = L+1
ISTO(L,N) = NSTN(J)
SECT(L,N) = TT(J)
KWV(L,N) = IKPS(J)
30 CONTINUE
20 CONTINUE
KOBS(N) = NSTM
200 FORMAT(6(I3,X,F7.2,X,I2,X))
RETURN
END
像
这样的读语句 READ(4,200) (NSTN(J),TT(J),IKPS(J),J=1,6)
输入错误导致程序(错误)终止。无法控制这一终止,尤其是无法进行进一步处理。
有两种方法可以避免这种终止,并且都涉及在读取语句中使用额外的说明符。一个是 iostat=
,另一个是 err=
。如果存在其中任何一个,则错误不会导致终止。
与iostat
(对于整数istat
):
READ(4,200,iostat=istat) (NSTN(J),TT(J),IKPS(J),J=1,6)
然后在错误情况下,istat
将具有(取决于处理器的)正值。当(且仅当)没有错误时,它将为零。
使用 err
(对于某些标签,例如 991
):
READ(4,200,err=991) (NSTN(J),TT(J),IKPS(J),J=1,6)
把所有这些放在一起,让我们想象一个外循环
DO 100 LINE=1,91959
READ(4,200,IOSTAT=ISTAT) (NSTN(J),TT(J),IKPS(J),J=1,6)
IF (ISTAT.NE.0) THEN
PRINT *, 'It went wrong on line', LINE
STOP
END IF
...
100 CONTINUE
或
DO 100 LINE=1,91959
READ(4,200,ERR=991) (NSTN(J),TT(J),IKPS(J),J=1,6)
...
100 CONTINUE
...
991 PRINT *, 'It went wrong on line', LINE
STOP
[我无法让自己像 1980 年那样编写代码。]