我正在编辑一个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-apple-darwin8-gfortran-4.2))。我知道fseek
不是标准的Fortran例程。
我想知道是否有另类选择。我知道我可以做read(filenum,rec=somevalue)
之类的事情,但我怎么能以类似的方式使用它呢?我还考虑尝试用read(,advance='no')
进行阅读以进行测试,然后再使用advance='yes'
进行阅读,如果格式正确,则需要特定的格式表达式,但未指定。谢谢。
答案 0 :(得分:2)
您必须使用退格键返回上一条记录。传统的Fortran IO是基于记录的,非基于流的(如在C中)
答案 1 :(得分:1)
在Linux和Windows上,通常可以计算搜索偏移量。
但是,在面向记录的文件系统(OpenVMS,OS / 370,NOS等)上,来自ftell()
的值是一个神奇的cookie,无法使用简单算术检查或处理以计算新文件位置。相反,使用rewind
语句返回文件的开头(如果它确实可以搜索)。
答案 2 :(得分:1)
如果您不确定文件内容,还有另一种处理输入的技术 - 在这种情况下,有时文件内容不正确或不同 - 这是读取字符串,然后检查字符串的内容。如果内容有效,则可以使用read语句从字符串中读取。或者,如果内容“不同”,请使用其他读取语句,或采取适当的操作。无需倒带或退格。您必须猜测最长的行长度来声明字符串的长度。