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

如何用Julia读取Fortran90生成的二进制文件?

用Julia读取Fortran无格式二进制文件

Fortran的无格式二进制文件会给每个写入的记录前后加上记录长度标记(通常是4字节整数,64位编译环境下可能是8字节),读取时必须处理这些标记才能正确获取数据。以下是对应你Fortran写入逻辑的Julia读取方案:

首先明确数据类型对应关系:

  • Fortran默认整数(integer):对应Julia的Int32(32位Fortran编译)或Int64(64位编译),不确定的话先试Int32,读错再替换。
  • 三维矩阵(若为Fortran默认单精度real):对应Julia的Float32;如果是双精度real(8)则对应Float64。

完整读取代码

# 打开二进制文件
io = open("ring.grid", "r")

# 读取第一个记录:nv
# 先读记录长度标记
rec_len = read(io, Int32)
nv = read(io, Int32)
# 读取记录末尾的长度标记(可选,用于验证数据完整性)
read(io, Int32)

# 读取第二个记录:Nx, Ny, Nzt
rec_len = read(io, Int32)
Nx, Ny, Nzt = read(io, Int32, 3)
read(io, Int32)

# 读取第三个记录:xx三维数组
rec_len = read(io, Int32)
xx = reshape(read(io, Float32, Nx*Ny*Nzt), (Nx, Ny, Nzt))
read(io, Int32)

# 读取第四个记录:yy三维数组
rec_len = read(io, Int32)
yy = reshape(read(io, Float32, Nx*Ny*Nzt), (Nx, Ny, Nzt))
read(io, Int32)

# 读取第五个记录:zz三维数组
rec_len = read(io, Int32)
zz = reshape(read(io, Float32, Nx*Ny*Nzt), (Nx, Ny, Nzt))
read(io, Int32)

# 关闭文件
close(io)

关键说明

  • 若你的Fortran是64位编译环境,需将所有Int32替换为Int64,数组元素类型若为双精度则用Float64。
  • read(io, T, n)会一次性读取n个类型为T的数据,返回一维数组,再用reshape转为三维矩阵——Fortran和Julia默认都是列优先,所以维度顺序无需调整。
  • 记录长度标记的读取是核心,跳过会导致后续数据读取错位。

简化封装写法

如果需要多次读取记录,可以封装一个函数来处理,同时验证记录完整性:

function read_fortran_record(io, T, n=1)
    rec_len = read(io, Int32)
    data = read(io, T, n)
    @assert read(io, Int32) == rec_len "记录长度不匹配,可能是数据类型或字节序错误"
    n == 1 ? data[1] : data
end

io = open("ring.grid", "r")
nv = read_fortran_record(io, Int32)
Nx, Ny, Nzt = read_fortran_record(io, Int32, 3)
xx = reshape(read_fortran_record(io, Float32, Nx*Ny*Nzt), (Nx, Ny, Nzt))
yy = reshape(read_fortran_record(io, Float32, Nx*Ny*Nzt), (Nx, Ny, Nzt))
zz = reshape(read_fortran_record(io, Float32, Nx*Ny*Nzt), (Nx, Ny, Nzt))
close(io)

内容的提问来源于stack exchange,提问作者André Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:52:20