You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:36:07