我正在尝试使用下面的代码来读取格式化文件并将其写入另一个文件。但是,在运行时它会显示以下错误
Fortran运行时错误:列表输入的第1项中的实数错误
$ ./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
我的i_conv.farm文件是
1604151625 Japan
32.79 130.58 10 16 25 06 1 30 100
II.BORG.00.BH1.A
II.BORG.00
II.BORG.00.BH2.A
II.BORG.00
II.BORG.00.BHZ.A
II.BORG.00
20 120 1
0.002 1 1 1 1
II.DGAR.00.BH1.A
II.DGAR.00
II.DGAR.00.BH2.A
II.DGAR.00
II.DGAR.00.BHZ.A
II.DGAR.00
20 120 1
0.002 1 1 1 1
II.TAU.00.BH1.A
II.TAU.00
II.TAU.00.BH2.A
II.TAU.00
II.TAU.00.BHZ.A
II.TAU.00
20 120 1
0.002 1 1 1 1
II.UOSS.00.BH1.A
II.UOSS.00
II.UOSS.00.BH2.A
II.UOSS.00
II.UOSS.00.BHZ.A
II.UOSS.00
20 120 1
0.002 1 1 1 1
II.WRAB.00.BH1.A
II.WRAB.00
II.WRAB.00.BH2.A
II.WRAB.00
II.WRAB.00.BHZ.A
II.WRAB.00
20 120 1
0.002 1 1 1 1
IU.AFI.00.BH1.A
IU.AFI.00
IU.AFI.00.BH2.A
IU.AFI.00
IU.AFI.00.BHZ.A
IU.AFI.00
20 120 1
0.002 1 1 1 1
我真的不知道格式化数据不对的地方?
答案 0 :(得分:1)
让我们计算read(5)
,我认为这是从stdin
中读取的,在您的情况下是i_conv.farm
read(5,'(a)') event
这将“1604151625 Japan”改为event
read(5,*) alats,alons,depth,hr0,mnu0,sec0,id,delmin,delmax
这读取“32.79 130.58 10 16 25 06 1 30 100”这一行并将其分配给变量。
然后你调用GEOM
,但我认为那个子程序不能从stdin
读取。接下来是
read(5,'(a)') fname
这是空行。所以已经有些可疑了。接下来是
read(5,'(a)') scode
所以scode
变为“II.BORG.00.BH1.A”。现在我们来看看它最终落空的地方:
read(5,*) ta,du,dt,f1,f2,iph,nr,iuni
但该行是“II.BORG.00” - 无法将其解析为ta
的数字。
查看代码,调试很麻烦,我甚至不知道它应该做什么。应该将i_conv.farm
的哪一部分读入哪个值?如果您想阅读标准输入,我强烈建议您使用read(*,
代替read(5,
,因为您无法保证5将永远是标准输入。
此时,我将手伸向空中,并开始完全重写至少文件i / o部分的程序。