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

