爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29547|回复: 38

[分享资料] 怎么用fortran读取.grd文件

[复制链接]
发表于 2013-1-27 20:46:07 | 显示全部楼层 |阅读模式

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

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

x
用fwrite将图形文件转向二进制文件输出,出来之后是.grd文件,请问怎么用fortran读取这个.grd文件? 请各位大侠指点
密码修改失败请联系微信:mofangbao
发表于 2016-3-15 18:05:28 | 显示全部楼层
真心觉得论坛应该在每一个频道开一个小白专题,对于刚入门的小白来说,心好累。好多看不懂各位大神只讲述了核心所在,启示小白连怎么开始都不懂,虽说要多看看书啊帖子的,可是上面讲的也不具体,不知道谁有很好的学习经验来分享呢?
密码修改失败请联系微信:mofangbao
回复 支持 4 反对 0

使用道具 举报

发表于 2013-1-29 12:00:55 | 显示全部楼层

没想过要误导谁,就是点个人经验,也提供了较为可行的建议,我写的grd就不行,dat基本都是可以的。扩展名如果没有意义的话就不需要扩展名了,二进制文件的种类很多,光grd格式的就很多种,fortran只能识别其中很少的一部分,阁下不信的话可以用surfer等软件随便生成几个试试看,binary多数是不能正确读取的。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

0
早起挑战累计收入
发表于 2013-1-27 21:12:48 | 显示全部楼层
先在论坛找经验贴
密码修改失败请联系微信:mofangbao
发表于 2013-1-27 21:31:15 | 显示全部楼层
这个好像是读不了的,因为你的grads写文件的时候把坐标什么的貌似也写进去了,所以输出dat格式的好了。

评分

参与人数 1金钱 +8 收起 理由
mofangbao + 8 既然看到减分了就帮你补上吧~

查看全部评分

密码修改失败请联系微信:mofangbao
发表于 2013-1-27 22:23:28 | 显示全部楼层
你保存的时候是按照什么样的格式和顺序保存进去的  就用什么样的方式读取出来就行了
密码修改失败请联系微信:mofangbao
 成长值: 19710
发表于 2013-1-29 10:01:28 | 显示全部楼层
lqouc 发表于 2013-1-27 21:31
这个好像是读不了的,因为你的grads写文件的时候把坐标什么的貌似也写进去了,所以输出dat格式的好了。

fwrite出来的是二进制文件,可以读,grd,dat只是扩展名,没啥意义,请不要误导人家~
密码修改失败请联系微信:mofangbao
 成长值: 19710
发表于 2013-1-29 12:43:33 | 显示全部楼层
本帖最后由 兰溪之水 于 2013-1-29 12:49 编辑
lqouc 发表于 2013-1-29 12:00
没想过要误导谁,就是点个人经验,也提供了较为可行的建议,我写的grd就不行,dat基本都是可以的。扩展名 ...

呵呵,提出质疑很好,首先承认我说得有点不是很对的就是“扩展名没啥意义”,正确的应该说“改变扩展名并不能改变文件的实质”,扩展名的意义是让软件能比较好地识别文件是什么类型的,比如.txt是文本文件,.avi是视频文件,但是如果你把一个文本文件如test.txt改名为test.dat,难道它就变成了二进制文件了么?显然不是,改名后你用记事本依然能正确打开读取,所以扩展名并不完全代表文件的实质,在Linux下更明显了~
好了~现在到用fwrite写出二进制文件的问题了:首先看看fwrite的用法:
---------------------------------------------------------------------------------------------

set fwrite <-be or -le> <-sq or -st> <-ap or -cl> fname
Sets the filename for data output as well as byte ordering and data format.

fname   output filename (default = grads.fwrite)
-be     output data byte ordering is big endian
-le     output data byte ordering is little endian

-sq     output data format is sequential
-st     output data format is stream (default)

-ap     output data is appended to existing file
-cl     output data replaces existing file if it exists (default)


---------------------------------------------------------------------------------------------
从上面可以看出,写出二进制文件的一些设置,fname就是文件名,我们可以随便定义,如ps.grd,ps.dat,甚至不要扩展名,直接为ps;还有要注意的问题,关于big endian 和Little endian的问题,默认输出的是little endian,在大部分Unix系统下big endian是比较常见的,所以写程序读取的时候要注意这点;再一个就是sequentialstream的问题,默认是stream存储的格式。上面都是一些需要注意的问题。
所以如果你说读不了,那只可能是你忽略了某些细节。
好吧,既然都花那么多时间码了那么多字了,再给你写个程序吧:

  1. program test_grd_dat
  2. implicit none
  3.   real :: ps_grd(72,46)
  4.   real :: ps_dat(72,46)
  5.   real :: ps(72,46)

  6.   integer :: i,j

  7.   open(10,file='ps.grd',form='unformatted',recl=72*46)
  8.   read(10,rec=1) ((ps_grd(i,j),i=1,72),j=1,46)
  9.   close(10)

  10.   open(20,file='ps.dat',form='unformatted',recl=72*46)
  11.   read(20,rec=1) ((ps_dat(i,j),i=1,72),j=1,46)
  12.   close(20)

  13.   open(20,file='ps',form='unformatted',recl=72*46)
  14.   read(20,rec=1) ((ps(i,j),i=1,72),j=1,46)
  15.   close(20)

  16.   write(*,*) ps_grd(30,40:42)
  17.   write(*,*) ps_dat(30,40:42)
  18.   write(*,*)     ps(30,40:42)

  19.   stop
  20. end

QQ截图20130129124047.bmp

好了,该收拾行李回家了。。。。
@mofangbao大大快给贡献和体力~

评分

参与人数 1金钱 +15 贡献 +5 体力 +200 收起 理由
mofangbao + 15 + 5 + 200 码这么多字不容易~给你点体力

查看全部评分

密码修改失败请联系微信:mofangbao
 成长值: 19710
发表于 2013-1-29 12:55:55 | 显示全部楼层
lqouc 发表于 2013-1-29 12:00
没想过要误导谁,就是点个人经验,也提供了较为可行的建议,我写的grd就不行,dat基本都是可以的。扩展名 ...

对了,关于你的提到surfer生成的而二进制文件的问题,因为没用过surfer,不加以评论,但据我的了解,只要你知道了文件的存储的格式,没有说读不了的,主要是一些设置问题要注意~
密码修改失败请联系微信:mofangbao
0
早起挑战累计收入
发表于 2013-1-29 13:05:35 | 显示全部楼层
lqouc 发表于 2013-1-29 12:00
没想过要误导谁,就是点个人经验,也提供了较为可行的建议,我写的grd就不行,dat基本都是可以的。扩展名 ...

谢谢你的回答,关于文件后缀和编码的关系,我写过一个帖子,当然也只是个人的一些理解,不一定完全正确:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=7395
grads用fwrite写数据的时候写入的只是数据,并没有坐标信息,grads中传统的坐标维度是固定的,由内层到外层是:x y z var t,也就是说只要是在grads中使用数据,内存中都是按照这个顺序来管理的,如果你的fwrite使用正确,也就是输出顺序是按照上面的顺序进行的,那么在fortran中读取的时候也应该按照这个顺序来读取,至于输出为什么样的后缀,这并不能影响文件的本质,后缀可以简单的理解为是让大家更容易记住这个文件的格式,就好像人的姓名一样,是可以自己取的。
兰溪的例子不错,希望提问的楼主好好看看,很多人对文件格式、后缀认识不清也导致提问的时候别人无从帮你,这有一部分也是老师的责任,有些老师上课就分不清楚,老说十进制文件转二进制文件什么的,dat和grd也不给学生解释清楚。
再次感谢你的回答,我相信愿意回答别人提问的朋友都有一颗善良的心~
密码修改失败请联系微信:mofangbao
发表于 2013-1-29 16:19:47 | 显示全部楼层
mofangbao 发表于 2013-1-29 13:05
谢谢你的回答,关于文件后缀和编码的关系,我写过一个帖子,当然也只是个人的一些理解,不一定完全正确: ...

谢谢回答,当然还有@兰溪之水,感谢大家的分享和关注,弄得我像是楼主一样。关于grads输出怎么设置我还真没研究,我全是用的dat格式的。至于为什么说是坐标问题,因为据我所知grd格式的和dat还是存在不一样的。在grd格式的每一行末尾,存在一个换行符,这也就和数据的坐标是相关的,而fortran读取的时候经常不能识别,至少那个符号不是数据,当然合适自己摸索的结果,不一定对,我也不知道是不是我这里的编译器问题。就grd文件的使用来说,主要是应用在surfer和grads,在surfer中提供了很多版本的grd格式,而且没有对格式的解释,我试过大部分直接读取的话基本都会出错,这也就是说如果随便拿一个grd格式的文件用fortran打开很可能会失败,但是不一定就是数据的问题,最好还是能了解其存储规则,如果知道的话fortran还是可以用的。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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