如何用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
相关产品推荐
相关产品推荐

