2015-05-21 22 views
0

截至目前,我檢查,如果iostat的大於0並重新打開文件更小,如果名稱列表找不到(這是真的很醜),即:Fortran語言:檢查名稱列表存在

read(100, nml=nm_tensor, iostat = ios) 
if (ios < 0) then 
    close(100) 
    open(100, file="input_nm", status='old', action="read", iostat = ios) 
end if 

如何在閱讀文件之前檢查文件中是否存在名稱列表?當沒有名稱列表並且導致文件結束錯誤時,是否有更好的方法來恢復?

+0

如果名稱列表不在你關閉並重新打開文件之前出現,爲什麼它應該在之後出現?如果你只是想知道你是否通過了名單,你可以在閱讀名單之前進行「REWIND」。 – chw21

+0

在問題的第一部分,我想在完全閱讀之前檢查名單的存在。這樣我就不會拋出任何錯誤,這將更加優雅。 但是'REWIND'正是我在問題的第二部分尋找的內容,謝謝! :) – Johannes90

+0

在閱讀文件之前,您無法確定文件中是否存在名稱列表或其他內容。爲了找到答案,必須先閱讀它。如果另一個進程正在寫入文件,倒帶將不會幫助您,除非文件被共享。如果另一個進程已經寫入文件,打開和關閉可能會起作用。 – cup

回答

0

假設你正在閱讀的文件是:

&INT_NAMELIST 
    A = 1, 
    B = 2 
/
&REAL_NAMELIST 
    X = 3.15, 
    Y = 2.71 
/

然後程序

INTEGER :: A, B 
REAL :: X, Y 
NAMELIST /INT_NAMELIST/ A, B 
NAMELIST /REAL_NAMELIST/ X, Y 
OPEN(unit=100, action="READ", status="OLD") 
read(100, nml=INT_NAMELIST) 
read(100, nml=REAL_NAMELIST) 

的工作,但改變讀取語句的順序,它不會:

read(100, nml=REAL_NAMELIST) 
read(100, nml=INT_NAMELIST) 

因爲它已經讀過INT_NAMELIST,直到找到並讀取了REAL_NAMELIST。如果你不知道該文件名稱列表中的順序,你應該使用REWIND要讀取每一個新的名稱列表之前,文件位置復位到文件的開頭:

read(100, nml=REAL_NAMELIST) 
rewind(100) 
read(100, nml=INT_NAMELIST)