登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 ljh110011 于 2019-8-8 18:25 编辑
这个帖子中心思想,是简单描述碰到的form=‘binary’和form=‘unformatted’的差异和编程中需要回避的坑。最近由于开发模式时debug需要,只好重新使用超久没碰的Fortran语言。。。
编译运行Fortran程序,就要用到编译器了。2005年末发布的Compaq Visual Fortran(简称CVF)就太老旧了,已经是在淘汰边缘的产物,当然不予考虑了。之前一直在用的Intel Visual Fortran(简称IVF)软件体积又太庞大,在新设备上面重新安装一遍也挺费劲,就选用配置起来比较简单的GNU Fortran(简称GF)做编译器。
那么这时候,问题就出现在这里:
以前使用Fortran读写的时候,写二进制(GrADS用的无格式二进制)就是用form=‘binary’。用CVF和IVF都能编译,然而用GF竟然编译不过。
通过调研发现,本论坛和某度等搜索引擎,都很容易搜到大量关于FORTRAN语言读写无格式二进制文件时,form=‘binary’和form=‘unformatted’的问题和争论。
参考了一些帖子,有研究提出binary和unformatted格式存在4倍关系等观点。如下:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=27204&extra=&page=1
http://bbs.06climate.com/forum.php?mod=viewthread&tid=27220
http://bbs.06climate.com/forum.php?mod=viewthread&tid=30071&highlight=Fortran%2Bbinary%2Bunformatted
当然,两者都是二进制格式,4倍这么个说法有一定的道理,因为如果设置的access='direct',form=‘unformatted’输出时,就会包含数据和记录的边界;而access='direct',form=‘binary’输出时,只包含数据;所以这种情况下,用unformatted输出的结果就会比binary的文件要大,因为它包含了数据记录的边界。那么这样写文件,当然会有区别的,但是,是否为4倍呢,这个就要实际情况实际分析。
但这两种格式本身就是不一样的,是不能简单地将两者直接进行对比的。
1. form=‘binary’ 不是Fortran标准下的,不过是某些Fortran编译器提供识别和支持,所以也很多人一直在使用,也有某些编译器如GF不支持这种设置;
2. form=‘unformatted’是符合Fortran标准的用法,而且用form=‘unformatted’,也能达到form=‘binary’ 的输出效果(指文件内容,文件大小和文件格式完全相同),即设置成流文件输出,access='stream',form=‘unformatted’。 那此时输出的文件就和用form=‘binary’输出的效果相同,而且符合Fortran的标准。此时两者输出的文件就完全相同了,就不纯在什么4倍的关系了。至于其他形式的输出是否是4倍关系还是多少倍关系,就不再深究了。
3. 需要注意的是,access='stream'用法,是Fortran2003的标准中包含的,现在新的Fortran编译器都支持,而老旧的CVF是不支持的。
4. 在编程中,建议不要用不符合标准的form=‘binary’的用法,尽量统一使用 form=‘unformatted’ 的用法,使程序符合Fortran标准,方便日后程序的移植。
最后贴上简单测试用的代码: - <font size="3">program test
- implicit none
- real(8) :: aa(10000)=9.99
- integer :: i
- open(10,file="binary.bin",form="binary",status="replace")
- open(11,file="unformatted.bin",access="stream",form="unformatted",status="replace")
- do i=1,10000,1
- write(10) aa(i)
- write(11) aa(i)
-
- end do
- end program test</font>
复制代码
试验一: 该代码直接用IVF编译运行,输出的binary.bin和unformatted.bin的文件内容,文件大小和文件格式完全相同。
试验二: 由于CVF不支持access='stream',form=‘unformatted’的用法,而GF不支持form=‘binary’的用法,因此设计试验二。 注释程序的7和11行,用CVF编译输出binary.bin; 注释程序的6和10行,用GF编译输出unformatted.bin。 对比两者结果,文件内容,文件大小和文件格式完全相同。
如图:
|