爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6554|回复: 6

[经验总结] gfortran与Fortran 6.x 中二进制问题(form='binary'/'unformatted')的解决

[复制链接]

新浪微博达人勋

发表于 2014-11-3 14:14:56 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 /xin村儿/ 于 2015-2-5 19:13 编辑

gfortran与Fortran 6.x 中二进制问题(form='binary'/'unformatted')的解决

纠结了多年的’心病‘,今天偶然蹦出’经验‘了——

因为gfortran不支持binary格式,二进制只能以unformatted表达,有帖子说使用gfortran编译时直接把binary换成unformatted即可,但实践中还是出现错误,为什么呢?请往下看:

Fortran6.6中,binary和unformatted均可使用,但用的时候有区别:      
OPEN(10,FILE='路径/AAAAA.grd',FORM="unformatted",status='old',ACCESS='DIRECT', RECL=NX*NY)   !!!注意不*4
等价于
OPEN(10,FILE='路径/AAAAA.grd',FORM="binary",        status='old',ACCESS='DIRECT', RECL=NX*NY*4)   !!!注意要*4


而在gfortran中,二进制只能使用unformatted,但用的时候和Fortran6.6又有区别:      
OPEN(10,FILE='路径/AAAAA.grd',FORM="unformatted",status='old',ACCESS='DIRECT', RECL=NX*NY*4)   !!!注意要*4
等价于Fortran6.6中的
OPEN(10,FILE='路径/AAAAA.grd',FORM="unformatted",status='old',ACCESS='DIRECT', RECL=NX*NY)   !!!注意不*4

读写时均为: READ/WRITE(10, rec=IREC) ARR      !!!假设数组为ARR(I,J), 注意有格式时不能直接使用数组名ARR
个人经验,有待更多验证!
补充:http://bbs.06climate.com/forum.php?mod=viewthread&tid=27204











来自群组: 成于大气 信达天下

评分

参与人数 1贡献 +2 收起 理由
rurutia + 2 大感谢!

查看全部评分

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

新浪微博达人勋

发表于 2014-11-3 14:54:56 | 显示全部楼层
非常感谢楼主的经验分享,非常有帮助~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2014-11-3 15:39:34 | 显示全部楼层
这个乘4或不乘4不能随便这么下结论的。。因为这些默认字节长度编译器可以设置的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-11-10 17:14:02 | 显示全部楼层
兰溪之水 发表于 2014-11-3 15:39
这个乘4或不乘4不能随便这么下结论的。。因为这些默认字节长度编译器可以设置的

谢谢兰溪哥指点,这些问题没有深究过,或许正因如此,所以不懂老出错走弯路,只是自己总结经验在这里
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-11-13 17:50:06 | 显示全部楼层
兰溪之水 发表于 2014-11-3 15:39
这个乘4或不乘4不能随便这么下结论的。。因为这些默认字节长度编译器可以设置的

兰溪老师,可不可以详细点讲一讲*4或不*4的意义
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-6-29 16:21:03 | 显示全部楼层
兰溪之水 发表于 2014-11-3 15:39
这个乘4或不乘4不能随便这么下结论的。。因为这些默认字节长度编译器可以设置的

@兰溪之水 大大,我是在gfortran下编译的,我的问题是读取出错但是不知道怎么改可以帮忙看看嘛,我的程序如下:
program main
integer,parameter::nxy=144*73,nt=54,ct=0
real a(nxy,nt),ind(nt),r(nxy),bb(nxy),cc,t,n(nxy),aa(nxy),dd(nxy),ee(nxy),ff,gg(nxy)
real x1(nt),y1(nxy,nt)
open(3,file='hgt_winter_1961_2014.grd',form='unformatted',status='old',access='direct',recl=nxy*nt*4)
open(4,file='tp.grd',form='unformatted',status='old',access='direct',recl=nxy*nt*4)
open(7,file='rt.grd',form='unformatted')
open(8,file='tt.grd',form='unformatted')
read(3)((a(i,it),i=1,nxy),it=1,nt)
read(4)(ind(it),it=1,nt)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2022-4-25 22:25:06 | 显示全部楼层

关于gfortran不能支持binary的问题

本帖最后由 老泥巴 于 2022-4-25 22:34 编辑

自己摸索了一下,写了一个小例子:
program ex20220421
    implicit none
    real::a=10.23,b
    !gfortran不支持binary,这边写入.grd需要指定access='stream'
    open(unit=1,file='svp.grd',access='stream')
    !切记写入的时候不可指定格式,也不可以写write(1,*)
    write(1) a
    close(1)
   
    !读取文件输出看看
    open(unit=2,file='svp.grd',access='stream')
    !注意二进制文件无格式,所以读取的时候直接read(2),不可以写read(2,*)
    read(2) b
    print*,b
    close(2)
end program ex20220421
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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