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

文件关闭时会写入多余数据吗?Fortran无格式写文件大小异常问询

为什么Fortran无格式写入的文件比预期大?

你遇到的这个情况其实是Fortran无格式文件的标准特性——默认的记录式存储会给每个写入的记录加上首尾的长度标记,咱们来具体拆解:

原因分析

当你用form='unformatted'打开文件但未指定额外访问模式时,Fortran默认会创建记录式无格式文件:

  • 每个write语句会生成一个独立的"记录"单元
  • 每个记录的开头和结尾会各添加一个4字节的整数,用来存储这条记录的总字节数(你的数据是3个4字节的real(kind=4),总共12字节,所以这两个标记的值都是12)
  • 总文件大小就是:4字节(开头标记) + 12字节(数据) + 4字节(结尾标记)= 20字节,和你用ls -lh看到的结果完全匹配

如何得到纯二进制数据(无额外标记)

如果想要写入没有多余字节的原始二进制数据,有两种常用方法:

方法1:使用流式访问(推荐,标准Fortran 2003+支持)

修改open语句,添加access='stream'参数,这样文件会以流式无格式模式存储,直接写入原始数据,不会添加记录标记:

open(unit=36, file='test.dat', iostat=err, form='unformatted', action='write', status='new', access='stream')

修改后重新运行程序,文件大小就会是你预期的12字节。

方法2:编译器扩展(兼容旧版Fortran)

如果你的编译器不支持流式访问,可以使用特定编译器的扩展语法,比如GCC Fortran的form='binary'(注意这是非标准语法,不同编译器可能有差异):

open(unit=36, file='test.dat', iostat=err, form='binary', action='write', status='new')

验证方法

你可以用hexdump命令查看文件的二进制内容,直观确认首尾的标记:

hexdump -C test.dat

原始的记录式文件会显示类似这样的内容(小端系统下):

00000000  0c 00 00 00 9a 99 99 3f  cd cc 7b 40 cd cc cc 3f  |.......?..{@...?|
00000010  0c 00 00 00                                       |....|
00000014

其中开头和结尾的0c 00 00 00就是12的4字节小端表示,中间的就是三个real(kind=4)的二进制值。

内容的提问来源于stack exchange,提问作者G. LC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:17:03