保存文件位置并返回fortran 90

时间:2011-11-18 22:41:51

标签: fortran fortran90

我正在编辑一个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'进行阅读,如果格式正确,则需要特定的格式表达式,但未指定。谢谢。

3 个答案:

答案 0 :(得分:2)

您必须使用退格键返回上一条记录。传统的Fortran IO是基于记录的,非基于流的(如在C中)

答案 1 :(得分:1)

在Linux和Windows上,通常可以计算搜索偏移量。

但是,在面向记录的文件系统(OpenVMS,OS / 370,NOS等)上,来自ftell()的值是一个神奇的cookie,无法使用简单算术检查或处理以计算新文件位置。相反,使用rewind语句返回文件的开头(如果它确实可以搜索)。

答案 2 :(得分:1)

如果您不确定文件内容,还有另一种处理输入的技术 - 在这种情况下,有时文件内容不正确或不同 - 这是读取字符串,然后检查字符串的内容。如果内容有效,则可以使用read语句从字符串中读取。或者,如果内容“不同”,请使用其他读取语句,或采取适当的操作。无需倒带或退格。您必须猜测最长的行长度来声明字符串的长度。