Fortran Coder

查看: 14883|回复: 6
打印 上一主题 下一主题

[文件读写] 关于二进制文件读取

[复制链接]

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
跳转到指定楼层
楼主
发表于 2017-9-1 11:17:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wxy 于 2017-9-1 11:38 编辑

图一是二进制文件的基本属性,这是一个491*411的格点数据,我在读取时只读到1*411就end of file 了,我让recl=mrow*mcol,结果只输出到1*1,我知道是RECL这里设置的有问题,但不清楚这种二维的数据该怎么设置recl,
[Fortran] 纯文本查看 复制代码
program main
implicit none
integer*4,parameter ::Mrow=411, Mcol=491,mxp=201801
real*4 ::grid1(Mcol,Mrow)
integer*4 irow,icol,status, kk0
      open(7,file='xd10kmlr1.bil',form="unformatted",access='direct',recl=mcol*4,iostat=status)
      open(8,file="bil.txt")
         kk0 = 0
do icol=1,mcol
do irow=1,mrow
         kk0=kk0+1

    read(7,rec=kk0)grid1(icol,irow)
    print*,icol ,irow,grid1(icol,irow)
    !  read(20, rec=kk0)(grid2(icol,irow,i),i=1,MXP)
    write(8,"(i3,2x,i3,2x,f7.2)") icol ,irow,grid1(icol,irow)
end do
end do
close(7)
end

QQ截图20170901110648.png (7.33 KB, 下载次数: 294)

QQ截图20170901110648.png

QQ截图20170901114041.png (37.11 KB, 下载次数: 282)

QQ截图20170901114041.png
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2017-9-1 11:40:02 | 只看该作者
可以考虑用 stream 方式读写,而不用 direct

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
板凳
 楼主| 发表于 2017-9-1 11:51:29 | 只看该作者
fcode 发表于 2017-9-1 11:40
可以考虑用 stream 方式读写,而不用 direct

嗯嗯 成功了 谢谢

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
地板
 楼主| 发表于 2017-9-2 12:21:03 | 只看该作者
本帖最后由 wxy 于 2017-9-2 12:23 编辑
fcode 发表于 2017-9-1 11:40
可以考虑用 stream 方式读写,而不用 direct

还想请教一下,我在读取32位数据时可以491*411全部读出来,但换成16位格式数据时
只读取出一半,而且读取出的值是很长一串数值,并不是想要的结果,我怎样可以设定成16位呢,我用的gfortran
[Fortran] 纯文本查看 复制代码
program main
implicit none
integer,parameter ::Mrow=411, Mcol=491
integer ::grid(Mcol,Mrow)
integer ::irow,icol
      open(7,file='xdem10km1.bil',access='stream',form="unformatted")
      open(8,file="bil.txt")

do icol=1,mcol
do irow=1,mrow


    read(7)grid(icol,irow)
    print*,icol ,irow,grid(icol,irow)
    !  read(20, rec=kk0)(grid2(icol,irow,i),i=1,MXP)
    write(8,*) icol ,irow,grid(icol,irow)
end do
end do
close(7)
end

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

5#
发表于 2017-9-2 15:44:13 | 只看该作者
wxy 发表于 2017-9-2 12:21
还想请教一下,我在读取32位数据时可以491*411全部读出来,但换成16位格式数据时
只读取出一半,而且读取 ...

1. 16位格式数据, 2-Byte INTEGER? 請試試
    INTEGER, PARAMETER :: ibyte2 = SELECTED_INT_KIND(r= 4) !  2-Byte INTEGER
    INTEGER(KIND=ibyte2) :: grid(mcol,mrow)

2. DIRECT/STREAM access, 不保證完全相容, 也可能compiler dependent

3.  图一是二进制文件的基本属性,这是一个491*411的格点数据,我在读取时只读到1*411就end of file
    open(7,file='xd10kmlr1.bil',form="unformatted",access='direct',recl=mcol*4,iostat=status)
-> open(7,file='xd10kmlr1.bil',form="unformatted",access='direct',REAL=4,iostat=status) ! 4-byte
-> open(7,file='xd10kmlr1.bil',form="unformatted",access='direct',RECL=1,iostat=status) ! one "4-byte" data
    RECL=?, compiler dependent

67

帖子

16

主题

0

精华

专家

F 币
275 元
贡献
201 点
6#
 楼主| 发表于 2017-9-2 21:28:22 | 只看该作者
chiangtp 发表于 2017-9-2 15:44
1. 16位格式数据, 2-Byte INTEGER? 請試試
    INTEGER, PARAMETER :: ibyte2 = SELECTED_INT_KIND(r= 4) ...

嗯嗯 明白了 谢谢

1

帖子

0

主题

0

精华

新人

F 币
15 元
贡献
3 点
7#
发表于 2019-4-2 16:34:03 | 只看该作者
wxy 发表于 2017-9-2 12:21
还想请教一下,我在读取32位数据时可以491*411全部读出来,但换成16位格式数据时
只读取出一半,而且读取 ...

我用你的代码读到一半就end of file了 请问该怎么改呢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-19 23:40

Powered by Tencent X3.4

© 2013-2024 Tencent

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