Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fortran 77和fortran 90之间的fortran文件读/写语义是否不同?_Fortran - Fatal编程技术网

fortran 77和fortran 90之间的fortran文件读/写语义是否不同?

fortran 77和fortran 90之间的fortran文件读/写语义是否不同?,fortran,Fortran,我继承了Fortran77程序的源代码和编译后的可执行文件。我不知道使用了什么编译器来生成现有的可执行文件,但是我使用的是GCC4.9.2。除此之外,该程序还从二进制文件中读取和写入记录。记录数也存储在文件的开头 我的问题是,我自己编译的可执行文件错误地读取了文件中的记录数,因此当它试图读取最后一条记录时会抛出一个错误。二进制数据文件是使用现有的可执行文件(我继承的那个)生成的,令人惊讶的是,当我使用现有的可执行文件读取数据文件时,它会按预期工作 我的问题是,根据平台、Fortran版本或编译器

我继承了Fortran77程序的源代码和编译后的可执行文件。我不知道使用了什么编译器来生成现有的可执行文件,但是我使用的是GCC4.9.2。除此之外,该程序还从二进制文件中读取和写入记录。记录数也存储在文件的开头

我的问题是,我自己编译的可执行文件错误地读取了文件中的记录数,因此当它试图读取最后一条记录时会抛出一个错误。二进制数据文件是使用现有的可执行文件(我继承的那个)生成的,令人惊讶的是,当我使用现有的可执行文件读取数据文件时,它会按预期工作

我的问题是,根据平台、Fortran版本或编译器类型/版本,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的知识。