fortran 77和fortran 90之间的fortran文件读/写语义是否不同?
我继承了Fortran77程序的源代码和编译后的可执行文件。我不知道使用了什么编译器来生成现有的可执行文件,但是我使用的是GCC4.9.2。除此之外,该程序还从二进制文件中读取和写入记录。记录数也存储在文件的开头 我的问题是,我自己编译的可执行文件错误地读取了文件中的记录数,因此当它试图读取最后一条记录时会抛出一个错误。二进制数据文件是使用现有的可执行文件(我继承的那个)生成的,令人惊讶的是,当我使用现有的可执行文件读取数据文件时,它会按预期工作 我的问题是,根据平台、Fortran版本或编译器类型/版本,Fortran读/写语句是否具有不同的语义(如文件布局) 值得一提的是,读写代码是fortran 77和fortran 90之间的fortran文件读/写语义是否不同?,fortran,Fortran,我继承了Fortran77程序的源代码和编译后的可执行文件。我不知道使用了什么编译器来生成现有的可执行文件,但是我使用的是GCC4.9.2。除此之外,该程序还从二进制文件中读取和写入记录。记录数也存储在文件的开头 我的问题是,我自己编译的可执行文件错误地读取了文件中的记录数,因此当它试图读取最后一条记录时会抛出一个错误。二进制数据文件是使用现有的可执行文件(我继承的那个)生成的,令人惊讶的是,当我使用现有的可执行文件读取数据文件时,它会按预期工作 我的问题是,根据平台、Fortran版本或编译器
WRITE(INLIB,REC=1)NPROD,(ELMNTS(K),K=1,ITE),(ATOMWT(KK),KK=1,
+ ITE),IOUT,INFILE,ITERM,IBM,LINEPR
READ(INLIB,REC=1)NPROD,(ELMNTS(K),K=1,ITE),(ATOMWT(KK),KK=1,ITE)
+ ,IOUT,INFILE,ITERM,IBM,LINEPR
NPROD
是文件中的记录数。当我在READ
语句后放置一个断点时,我可以看到NPROD
大约为300000条,而事实上只有大约2000条记录
这是打开文件的代码:
OPEN(UNIT=INLIB,FILE='PRODUCT.BIN',ACCESS='DIRECT',RECL=1188,
+ STATUS='OLD')
关于endianess,我认为我当前的平台与二进制数据文件兼容,因为如果我在十六进制编辑器中打开它,我可以看到一些清晰的ASCII文本,在程序的上下文中是有意义的。F77和F90之间没有什么区别,但整个系统之间存在差异。例如,请参阅。使用
inquire(iolength=reclen)nprod、elmnts(1:ite)、atomwt(1:ite)、iout、infle、iterm、ibm、linepr
查找实际记录长度,然后在开始时使用recl=reclen
。请参阅@casey给出的详尽答案。文件的大小(应该是1188字节的精确倍数)fortran记录是单个读/写语句中的全部“内容”。(因此,2000条记录意味着您有2000个读取,其中rec=1,rec=2,…
)为了好玩,记录被空填充到rec
,因此所有组合变量的大小小于或等于rec
的值。在问题中包含所有这些变量的声明(以及ITE
的值)可能很有用。我解决了这个问题。首先,文件大小是1188字节的倍数,我第一次读错了文件大小。其次,在数据文件的开头有一个垃圾记录;当我强制程序从第二条记录开始读取时,它会按预期工作。显然,我的源代码与最初创建数据文件时使用的代码不同。谢谢大家。今天我学到了很多关于fortran文件I/O的知识。