2016-11-07 53 views
0

我試圖使用下面的代碼來讀取格式化文件並將其寫入另一個文件。但是,在運行它顯示了以下錯誤Fortran運行時錯誤:列表輸入項目1中的實際數字不正確(單元= 5,文件='stdin')

Fortran運行時錯誤:錯誤的實數列表中輸入

$ ./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 

的第1項的源代碼如下

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

通過我的計數,代碼在嘗試讀取「ta」的值之前並未跳過(或讀取)開始「II.BORG」的所有行,並且無法解釋類似「II.BORG.00」作爲一個實數。我沒有把我的鞋子和襪子拿走,所以我的計數可能是不可靠的,但請檢查。 –

+1

你是否真的仍然在兩年前同樣的問題上陷入困境? http://stackoverflow.com/q/24303045/1004168。當您嘗試爲該問題提供的答案時,您獲得了什麼結果? – agentp

+0

@agentp他是一個不同的用戶。你看不到這一點,但他試圖在答案中提問,而答覆/問題已被主持人刪除。答案並不是真正的問題的確切答案,只是提示如何進行調試。 (我沒有太多地研究這個問題的細節,我傾向於不太關心在某人的代碼和輸入文件中關於I/O的這些非常具體的問題。)如果對這些問題中的一些問題的答案吸引了贊成,我們可以關閉他們作爲重複。我個人不會爲了它而提出任何答案,只要它提供了一個真正的解決方案。 –

回答

1

讓我們來算read(5),我認爲這是從stdin,讀而你的情況是i_conv.farm

read(5,'(a)') event 

這寫着 「1604151625日本」 入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程序的一部分。

+0

我很非常感謝你的回覆,在這麼詳細的地方教給我我應該注意的地方,似乎輸入文件有問題,我會嘗試去調試它。再次感謝!@ chw21 – Zion

相關問題