阅读输入文件时的Fortran打印行号

时间:2015-07-24 15:42:54

标签: fortran

我从输入文件收到格式化错误,我想确定输入文件中格式化错误的位置。
我的问题是:有没有办法打印我的fortran代码中发生错误的输入文件的行号?

这是我得到的错误:

$http({
    url: '...',
    params: { 'ts': new Date().getTime() }
})

这意味着代码在我的输入文件中的某些行上挂起,与上述格式不符。

以下是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

我想在上面的代码中添加一行来识别代码正在读取的当前行,这样当它挂起时,我会知道哪一行包含错误。谢谢你的帮助。

这是我尝试过的,它给了我另一个错误:

      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

2 个答案:

答案 0 :(得分:4)

使用类似

的读取语句
      READ(4,200)  (NSTN(J),TT(J),IKPS(J),J=1,6)

输入错误导致程序终止(错误)。一个人无法控制这种终止,特别是一个人无法进行进一步的处理。

有两种方法可以避免这种终止,并且都涉及在read语句中使用另一个说明符。一个是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年那样编写代码。]

答案 1 :(得分:2)

添加显式循环以读取您的数据,如:

      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)

这样,由于读取循环中的write语句,您将确切地知道它停止的位置。请注意,我添加了两个新标签,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