文件关闭时会写入多余数据吗?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
相关产品推荐
相关产品推荐

