用fortran 90保存文件位置并返回

用fortran 90保存文件位置并返回,fortran,fortran90,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 readi

我正在编辑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'
再次读取,如果格式正确,但这需要一个特定的格式表达式,但没有指定。谢谢。

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


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

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

如果您不确定文件内容(在本例中,有时文件内容不正确或不同),还有另一种处理输入的技术,即读入字符串,然后检查字符串的内容。如果内容有效,可以使用read语句读取字符串。或者,如果内容“不同”,请使用不同的read语句,或采取适当的措施。不需要倒带或退格。您必须猜测最长的行长度才能声明字符串的长度

你从哪里得到ftell和fseek?听起来你真的想做流式IO而不是直接IO…谢谢@haraldkl,我明白了,其他地方。。。如果我使用流IO而不是直接IO,我的read语句会改变吗?这是一个我没有编写的大型程序,因此我认为我很难找到并修改程序的其余部分。您忘记了调用,在您链接到的gfortran文档中,它说它是一个子程序,而不是函数,因此需要调用。流IO可能略有不同,但可移植到其他编译器。啊,对不起!我的代码中有一个call语句。我在发布之前正在清理这个,不小心把它删掉了。。。我会编辑这篇文章——谢谢你指出这一点。啊,如果我写的是原始的fortran代码,我会记住这一点。唉,这是我继承的更大的东西的一部分,恐怕不是我的选择。感谢对
ftell
的洞察——我认为这是一个位置的整数(就像emacs缓冲区中的一个点…)。我认为
倒带
是可行的,但不能一直回到开头,因为它是一个大文件,只需要返回几个记录……啊,类似于使用fortran的sscanf。。。对不幸的是,它是一个fortran未格式化的二进制文件,所以这种类型的操作会有点困难。。。