爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 9216|回复: 16

[经验总结] Fortran中binary与unformatted

 关闭 [复制链接]

新浪微博达人勋

发表于 2014-7-31 21:40:23 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 wuyejincao 于 2014-8-1 09:10 编辑

相信很多常用Fortran程序的人来说,经常遇到form='binary'或者form='unformatted'的问题。一般如果自己编程,通常会选择一种自己习惯的,比如现在很多人喜欢用binary。但突然有一天,从高手那拷贝了个程序,发现用的是form='unformatted',一下子茫然了,所以这里说一下我对这两者的理解。

由于底下回复的某位同学有完全不同意见,我加一条我的试验环境。
我是windows 7 64位下的Intel Fortran XE 2011。并且实验结果始终是在同一款软件下。


                               
登录/注册后可看大图


首先,两者都是二进制格式。

其次,我总结的结果是在长度上'unformatted='binary'*4。请看下面分析:
比如说现在有
假如现在有rain(m*n*nt)的一个三维数组,要求写进文件1里面去。
例1:open(12,file=file1,form='unformatted',access='direct',recl=m*n)
例2:open(12,file=file1,form='binary',access='direct',recl=m*n)
写数据的时候都用下列语句:
irec=1
do k=1,nt
write(12,rec=irec)((rain(i,j,k),j=1,n),i=1,m)
irec=irec+1
enddo

出现的结果是例1生成的数据文件是例2的4倍。所以如果把例2的recl=m*n改成recl=4*m*n才生成同样大小的文件。也就是说'unformatted='binary'*4

                               
登录/注册后可看大图


为啥会这样呢?
厄。。。我也不知道。。。随便聊聊。。。

                               
登录/注册后可看大图

刚搜索一下论坛,发现大家对这两者的关系比较模糊。比如下面这个帖子:http://bbs.06climate.com/forum.php?mod=viewthread&tid=13784

有的说binary读的时候不要用recl,有的认为程序走不通的时候把unformatted改成binary就好了,真是五花八门,各种说法。
除了上面的区别,再说几点见解:
1.open(11,file=file1,form='binary')这种格式确实用起来比较方便。
2.但是万一你要用到直接读取的时候情况就不一样。这时候就要用到recl了。
如果你要问我顺序读取和直接读取的区别。。。我会叫你把彭国伦的Fortran书翻到234页。。。




密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2014-7-31 22:41:20 | 显示全部楼层
form='binary'不是Fortran的标准,所以尽量统一用unformatted
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

新浪微博达人勋

发表于 2014-7-31 21:59:39 | 显示全部楼层
Fortran对二进制文件(direct access)RECL字段所设置的整数值所代表的大小会随着编译器不同而改变。 Visual Fortran /Intel Fortran 中默认视为n*4 bytes, G77视为n bytes。解决方法 Visual Fortran编译时加上后缀 /assume:byterecl
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-7-31 22:02:19 | 显示全部楼层
baishizhou 发表于 2014-7-31 21:59
Fortran对二进制文件(direct access)RECL字段所设置的整数值所代表的大小会随着编译器不同而改变。 Visua ...

你这个是字节数。我说的是两种格式。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-31 22:50:42 | 显示全部楼层
虽然我也说不清楚,但绝对不是你说的这样。建议你编辑帖子,有可能误导他人。binary和unformatted不是你这样的关系。
下面的链接供你参考
http://bbs.lasg.ac.cn/?action-viewthread-tid-5624
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-7-31 22:58:16 | 显示全部楼层
本帖最后由 freekiller 于 2014-7-31 22:59 编辑

我只知道unformatted数据需要头和尾标志符,你安按照下面的试试,或者定义字符串,你就知道不是你所谓的4倍关系了。下面供参考

你要是写一个real(8)::r(5000)数组的话unformatted文件应该是40008bytes
你肯定是用循环写的
unformatted每写一次,写的是一个记录
每个记录都是这种形式:

[数据长度]数据[数据长度]

其中[数据长度]是integer
你写了5000个记录,长度就是 5000*(8+2*4)
binary就是写数据,所以长度是 5000*8
有些编译器open的时候提供recordtype关键字,recordtype='stream'就和binary一样了

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-1 08:35:16 | 显示全部楼层
freekiller 发表于 2014-7-31 22:50
虽然我也说不清楚,但绝对不是你说的这样。建议你编辑帖子,有可能误导他人。binary和unformatted不是你这 ...

既然你都不清楚,你怎么知道我是误导别人。你这种说法本就是缺乏科学依据的。
不知道你给我的这个网址你看了没,看完其实他也没说清楚formatted和binary的区别。
我的结论是我试验的结果,事实做出来是这样的,请问还有问题吗
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-1 08:39:31 | 显示全部楼层
freekiller 发表于 2014-7-31 22:58
我只知道unformatted数据需要头和尾标志符,你安按照下面的试试,或者定义字符串,你就知道不是你所谓的4倍 ...

你的回复出自这里吧,我把网址贴出来:
http://www.newsmth.net/nForum/#!article/NumComp/103655
不知道那个论坛里面的人是不是你?

对于论坛大多数Fortran玩家来说,我想我的结论是可靠的。我提供了详细的代码和实验结论,如果错了,你能告诉我错在哪吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2014-8-1 08:39:39 | 显示全部楼层
wuyejincao 发表于 2014-8-1 08:35
既然你都不清楚,你怎么知道我是误导别人。你这种说法本就是缺乏科学依据的。
不知道你给我的这个网址你 ...

分享当然是我们很欢迎的啦,不过面对别人的质疑也要坦然面对啦,有争论不是坏事儿,只要不是掐架就行。互相都要以理服人哈~@freekiller ~
不希望帖子里面出现火药味,也许是我太敏感了~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-1 08:42:38 | 显示全部楼层
mofangbao 发表于 2014-8-1 08:39
分享当然是我们很欢迎的啦,不过面对别人的质疑也要坦然面对啦,有争论不是坏事儿,只要不是掐架就行。互 ...

关键他还复制了人家论坛上的话且没有说明出处。http://www.newsmth.net/nForum/#!article/NumComp/103655(2楼)
不知道我是不是太敏感了,这种引用不写出处的事情让我很烦恼。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表