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

使用Fortran实现无格式二进制数据与.txt格式互相转换的问题

问题原因拆解
  • 直接报错原因:你打开的输出文件是form="formatted"(格式化文本文件),执行write(1) x时没有指定输出格式,Fortran要求格式化读写必须提供格式说明(要么写格式字符串,要么用*启用列表定向输出),所以触发了Missing format的运行时错误。
  • 核心逻辑错误:你要读取的5data是二进制非格式化文件,不能用终端重定向<的方式当文本输入传递给程序,也不能用read(*,*)读取,更不能把原本是integer(kind=1)、real(kind=8)类型的内容读到character类型的变量中,类型不匹配会导致读取结果完全错乱。
  • Fortran非格式化二进制文件的读写要求:读取的变量顺序、类型、数量必须和写入时完全一致,否则会出现数据错位。
正确实现代码
program bin_to_data
    implicit none
    integer :: i
    real(kind=8) :: x
    ! 变量类型、数量必须和写入程序的定义完全对应
    integer(kind=1) :: spherical, linear, even
    
    ! 打开输入的二进制文件,指定为非格式化只读
    open(10, file="5data", form="unformatted", action="read")
    ! 打开输出的txt文本文件,指定为格式化只写
    open(20, file="5data_out.txt", form="formatted", action="write")
    
    ! 先读取开头的三个标志变量,顺序和写入时一致
    read(10) spherical, linear, even
    ! 写入txt,可自定义输出格式
    write(20, '(A, I0)') "spherical = ", spherical
    write(20, '(A, I0)') "linear = ", linear
    write(20, '(A, I0)') "even = ", even
    write(20, '(A)') "-----------------------"
    write(20, '(A)') "存储的5个实数值:"
    
    ! 循环读取5个双精度浮点数
    do i = 1, 5
        read(10) x
        ! 用F0.6格式输出浮点数,可根据需要调整小数位数
        write(20, '(I0, 2X, F0.6)') i, x
        ! 如果不需要严格控制格式,也可以用列表定向输出:write(20, *) i, x
    end do
    
    close(10)
    close(20)
end program bin_to_data
使用方法

编译上述代码后直接运行生成的可执行文件即可,不需要加<5data的重定向参数,程序会自动读取同目录下的5data二进制文件,输出可读的5data_out.txt文本文件。

注意事项
  • Fortran默认的非格式化二进制文件带有记录头,同一个编译器编译的读写程序不会有兼容问题,如果需要跨编译器/跨语言读取二进制文件,建议写入时指定access='stream'或者form='binary',避免记录头导致的数据错位。
  • 类型声明建议用iso_fortran_env模块的预定义常量,比如用int8代替integer(kind=1),real64代替real(kind=8),兼容性更好,避免不同编译器对kind编号的定义差异。

内容的提问来源于stack exchange,提问作者hh25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:24:03