爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5204|回复: 13

[求助] fortran二进制数据读取求助

[复制链接]

新浪微博达人勋

发表于 2016-5-14 08:28:02 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 小鑫 于 2016-5-15 15:22 编辑

向各位大神求助!HLEP!
我现在在用自己的程序读取商用软件fluent的二进制dat中的数据。dat数据中在我需要读取的各组数据之前有长度不一的数据(类似头文件),例如前面不需要的数据长度为34347字节,而接下来我需要读入的数据是2600个实数(2600X8字节)。目前我用的是fortran的直接读取操作,先是定义RECL=34347,然后READ(**,rec=2)(p(i),i=1,2600)这样读入我需要的数据p(一维数组长度2600)。但是当dat数据量非常大的时候,往往出现不需要读取的头数据长度m>2^31,此时我无法定义RECL=m.想请教大神有什么方法,可以读取我所需要的数据。我现在的想法是有没有命令可以移动打开二进制文件时的最初读取位置,将其由文件头转移至第m+1字节,这样我就可以读取我所需大小的数据了。
求助!

fluent二进制dat数据,前面的表头其实有很多,但都写在一块

fluent二进制dat数据,前面的表头其实有很多,但都写在一块

第二组我要读入的数据和表头

第二组我要读入的数据和表头

附一下我的程序:

CHARACTER(1403):: dum !用于接收第一组数据前表头字符
point_number2=22309 !第二组数据前的字符数量
point_number3=34347 !第三组数据前的字符数量
OPEN(19,FILE=***,FORM="UNFORMATTED",STATUS="OLD“ ,ACCESS="DIRECT",RECL=point_number2 ,MODE="READ")
READ(19,REC=1) dum, (p(i),i=1,2600) !读入第一组数据p
READ(19,REC=2) (pb(i),i=bfp_s(1),bfp_e(1))!读入第二组数据pb
  CLOSE(19)
OPEN(19,FILE=***,FORM="UNFORMATTED",STATUS="OLD“ ,ACCESS="DIRECT",RECL=point_number3 ,MODE="READ")
READ(19,REC=2) (pb(i),i=bfp_s(2),bfp_e(2))!读入第三组数据pb

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

新浪微博达人勋

 楼主| 发表于 2016-5-14 08:44:03 | 显示全部楼层
fluent的二进制dat数据中,有多组我需要的数据,如压力p、速度u、v、w,上一时刻的压力po、上一时刻的速度uo、vo、wo,我现在的程序对于第一组数据的读取是基本没问题的因为头文件的大小绝对不会大于2^31。但是当读到最后一组数据wo时,其前面的数据往往超过2^31,这时RECL的长度就无法定义了。
其实如果dat文件中的各种头文件长度要是是8字节的整数倍(和我需要读取双精度实数数据的长度相同),我就没那么麻烦了,定义RECL=8,然后找到我数据所在的rec就可以读了。但现在这部分文件动不动就是361啊这种长度,如果我定义了RECL=8,就会出现我读取的实数数据由上一行的最后一个字节和下一行的前七个字节构成,完全不知道这时候怎么读
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-14 11:18:25 | 显示全部楼层
HELP ME !
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2016-5-14 13:42:13 | 显示全部楼层
虽然你写了很多字,不过依然没有看明白。
表头不管有多长难道不是自己占一条记录的么?如果是的话直接跳过就行啊。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-14 13:59:37 | 显示全部楼层
lqouc 发表于 2016-5-14 13:42
虽然你写了很多字,不过依然没有看明白。
表头不管有多长难道不是自己占一条记录的么?如果是的话直接跳过 ...

要是文本格式的话,倒也好说,一行一条,顺序读下来,做好标示,到数据处,read就好。但是二进制文件它是紧密保存的,没有什么行的概念,后面直接就是数据,如果我查不出这表头的字符串数,定义一个大于它的字符串,读的时候想要的顺序就被吞了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-14 14:11:32 | 显示全部楼层
小鑫 发表于 2016-5-14 13:59
要是文本格式的话,倒也好说,一行一条,顺序读下来,做好标示,到数据处,read就好。但是二进制文件它是 ...

我没有说行,我说的是记录,就是rec。
一个文件应该不会是一条记录写下来的吧?直接定义form='binary'然后空读第一个记录看看能不能跳过去表头。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-14 14:20:03 | 显示全部楼层
lqouc 发表于 2016-5-14 14:11
我没有说行,我说的是记录,就是rec。
一个文件应该不会是一条记录写下来的吧?直接定义form='binary'然 ...

详细请教一下,ACCESS还保持“DIRECT”是吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-14 14:37:53 | 显示全部楼层
小鑫 发表于 2016-5-14 14:20
详细请教一下,ACCESS还保持“DIRECT”是吗?

是的,不要写recl了,其他的都不变
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-14 14:38:46 | 显示全部楼层
lqouc 发表于 2016-5-14 14:11
我没有说行,我说的是记录,就是rec。
一个文件应该不会是一条记录写下来的吧?直接定义form='binary'然 ...

版主,我将我所读取的数据结构截图以及我的部分主要程序添加到了我的一楼贴子,能帮我再看看吗?我总结一下我遇到的问题:例如:我要从dat文件中读取16组数据,16组数据的大小各不相同,每两组数据前还有不同数量字符的头文件。这种情况下,我无法固定直接读取中的RECL的长度
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-14 14:45:44 | 显示全部楼层
lqouc 发表于 2016-5-14 14:37
是的,不要写recl了,其他的都不变

试了一下,会报inconsistent record length的错误,查了下书,上面说direct直接读写的话,必须要有recl
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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