wxy 发表于 2017-9-2 12:21 我用你的代码读到一半就end of file了 请问该怎么改呢 |
chiangtp 发表于 2017-9-2 15:44 嗯嗯 明白了 谢谢 |
wxy 发表于 2017-9-2 12:21 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 |
本帖最后由 wxy 于 2017-9-2 12:23 编辑 fcode 发表于 2017-9-1 11:40 还想请教一下,我在读取32位数据时可以491*411全部读出来,但换成16位格式数据时 只读取出一半,而且读取出的值是很长一串数值,并不是想要的结果,我怎样可以设定成16位呢,我用的gfortran [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 |
fcode 发表于 2017-9-1 11:40 嗯嗯 成功了 谢谢 |
可以考虑用 stream 方式读写,而不用 direct |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-12-24 01:24