Fortran写入.dat文件仅首行有数据其余为零的问题如何解决
Fortran读取txt转GrADS用dat文件仅首行有效其余为零的修复方案
你的问题核心出在直接存取文件的记录长度设置错误,和write语句的维度没有关系,具体原因如下:
- 你用
INQUIRE(IOLENGTH=LREC) pr计算得到的LREC,是存储整个pr数组(共11123=123个单精度浮点数)所需的字节长度 - 你打开dat文件时设置
recl=LREC,意味着直接存取文件的每条记录长度都是123个浮点数的大小 - 后续循环写数据时,每条记录你只写入了1个浮点数(当前iz层的pr值),操作系统会自动把每条记录剩余的122个浮点数位置填充为0
- 如果你后续读取dat文件时是按顺序逐个读浮点数,第一个读到的是第一条记录的第一个值30.7,后面读到的都是第一条记录剩余的填充0,自然全是零
修复方案
方案1:保留直接存取模式,修正记录长度
把计算LREC的语句改成计算单层(单个记录要写的内容)的长度即可:
! 替换原错误语句:INQUIRE(IOLENGTH=LREC) pr INQUIRE(IOLENGTH=LREC) pr(:,:,1)
修改后LREC就是1个浮点数的长度,每条记录写1个值刚好填满,不会有填充零,输出的dat文件就是连续的123个有效浮点数。
方案2:改用GrADS常用的无格式顺序存取模式,适配性更强
GrADS默认支持的二进制dat大多是无格式顺序存取,还可以根据需要匹配字节序,代码可以简化为:
program convert integer,parameter::nlon=1,nlat=1,nz=123 real,dimension(nlat,nlon,nz)::pr integer::iz open(2,file='2020082100_1.txt',form='formatted',status='old') ! 无格式顺序存取不需要设置记录长度,需要匹配字节序可加convert='little_endian'参数 open(3,file='2020082100_1.dat',form='unformatted',status='replace') do iz=1,nz read(2,*) pr(1,1,iz) end do ! 直接写入整个数组即可,不需要循环逐记录写 write(3) pr close(2) close(3) end program convert
内容的提问来源于stack exchange,提问作者Uts_137
相关产品推荐
相关产品推荐

