【问题标题】:Reading formatted data - Fortran runtime error: Bad real number读取格式化数据 - Fortran 运行时错误:错误的实数
【发布时间】:2014-08-09 18:45:37
【问题描述】:

我正在尝试使用下面的代码来读取格式化文件并将其写入另一个文件。但是,在运行时它显示以下错误

$ ./conv.sac.farm < i_conv.farm
  #   stn  comp      Delta    Tr-time   Start in record
At line 54 of file Main/conv.sac.farm.f (unit = 5, file = 'stdin')
Fortran runtime error: Bad real number in item 1 of list input

源码如下

      PARAMETER (nd0=100000,pi=3.1415926)
      IMPLICIT COMPLEX*8 (Z)
      CHARACTER name*6,comp*6,fname*60,event*20
     -   ,cmp(0:3)*5,fname0*60,charac*15,scode*60
      REAL*8 GFACT(500),PP0(500),depth0
      integer hr0,mnu0,yr,month,day,hr,mnu
      REAL  x(nd0),y(nd0)
      DIMENSION Z(nd0),zpole(50),zero(50)
      data np,cmp/8,'disp.','vel. ','acc. ','orig.'/
      common /tbl/ip(110,14),is(110,14),secp(110,14),secs(110,14)
      read(5,'(a)') event
      read(5,*) alats,alons,depth,hr0,mnu0,sec0,id,delmin,delmax
      depth0=depth
      write(22,'(a,a5,3f7.2,2i3,f6.2)') 
     #            event,cmp(id),alats,alons,depth,hr0,mnu0,sec0
* << J-B travel time table >>
      OPEN(11,FILE='jb.ptime')
      OPEN(12,FILE='jb.stime')
1000  read(11,*,end=1001) n,(ip(n,i),secp(n,i),i=1,14)
      goto 1000
1001  read(12,*,end=1002) n,(is(n,i),secs(n,i),i=1,14)
      goto 1001
1002  continue
      close(11)
      close(12)
* << Geometrical factor >>
      OPEN(15,FILE='jb.table')
      CALL GEOM(GFACT,PP0,depth0)
      close(15)
      nstn=0
      print *,' #   stn  comp      Delta    Tr-time   Start in record'
5     read(5,'(a)') fname
      read(5,'(a)') scode
*     ta=advance of start-time relative the standard P/S arrival
*     du=duration
c
      if(fname.eq.'dummy') goto 90
      read(5,*) ta,du,dt,f1,f2,iph,nr,iuni
      open(1,file=fname)
      READ(1,'(g15.7)') dt0
      read(1,'(/////5g15.7)') dum, alat, alon, elev
      read(1,'(///////5i10)') yr, nday, hr,mnu, nsec
      read(1,'(5i10)') nmsec,ndum,ndum,ndum,nd
      read(1,'(/////)')
      read(1,'(a6,2x,a13)') name,charac
      read(1,'(////)')

等等..

第 54 行是

      read(5,*) ta,du,dt,f1,f2,iph,nr,iuni

我在这个链接之后发现了一个类似的问题

Fortran runtime error: Bad real number

但是,如果我理解正确,所提到的更正与读取未格式化的数据有关。尽管如此,鉴于我尝试读取的文件已格式化,我尝试并按预期失败了。

【问题讨论】:

  • 你想读什么?可以给我们i_conv.farm的对应行吗?
  • 使用我惊人的跨时间和空间调试能力,我猜想输入文件的第一行包含列标题,而不是任何可以解释为实数的内容。如果你想从没有我惊人力量的小众生那里得到帮助,请按照@AlexanderVogt 的建议。
  • 还要在数据中查找 NaN 或 ****** 或其他垃圾。顺便说一下,链接的问题只是令人困惑,应该忽略。
  • 我同意@HighPerformanceMark。列标题可能是您的问题,如果是这种情况,输入read(5,*) 来吃标题行可以解决您的问题。但是,如果没有看到输入文件,就不能肯定地说。

标签: fortran


【解决方案1】:

如果您无法在数据文件中轻松找到违规行,这里有一个小技巧:

将引发错误的读取替换为:

 read(5,'(a)')line
 read(line,*,iostat=ios) ta,du,dt,f1,f2,iph,nr,iuni
 if(ios>0)then
    write(*,*)'error reading line:',line
    stop
 endif

声明

 integer ios
 character*(200) line

可能只是为了调试而这样做,然后在解决问题后恢复到原始状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2016-10-12
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多