我在編輯fortran 90來讀取文件。一個特定的文件碰巧被一些額外的信息「污染」,所以我想嘗試一個閱讀然後倒帶;如果在錯誤重讀:保存文件位置並返回fortran 90
open(filenum,file=filename,form="unformatted",iostat=ierr) //'direct' access
...lots of stuff...
here = ftell(filenum)
read(filenum,iostat=ierr) var1, var2 //try reading as var1, var2
if(iswrong(var1, var2)) then //check if correct
call fseek(filenum,here-ftell(filenum),1) //rewind
read(filenum,iostat=ierr) vara, varb, varc //read as different type
endif
然而,當我編譯這個程序,我得到
Undefined symbols:
"_fseek_", referenced from:
___myreader__subroutine_name in myreader.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
(我試圖編譯的gfortran(i686的 - 蘋果darwin8-gfortran-4.2))。我明白fseek
不是標準的fortran程序。
我不知道是否有一種替代方法。我知道我可以做類似read(filenum,rec=somevalue)
的東西,但我怎樣才能以類似的方式使用它?我也想過嘗試向read(,advance='no')
閱讀測試,然後用advance='yes'
再次閱讀,如果它是正確的格式,但是這需要一個特定格式的表達,這是沒有規定。謝謝。
你從哪裏得到ftell和fseek?這聽起來像你真正想要做的IO流,而不是直接IO ... – haraldkl
感謝@haraldkl,我明白了[這裏](http://gcc.gnu.org/onlinedocs/gfortran/FSEEK.html)和其他地方...如果我使用流IO而不是直接讀取語句,會不會改變?這是一個很大的程序,我沒有寫,所以我認爲我很難追捕和修改程序的其餘部分。 – hatmatrix
你忘記了呼叫,在你鏈接到的gfortran的文檔中,它表示它是一個子程序,而不是函數,因此需要呼叫。流IO將略有不同,但可移植到其他編譯器。 – haraldkl