关于Fortran写入NUL字符时文件混入01字符的技术疑问
为什么gfortran写入无格式顺序文件时会混杂0x01字符?
你遇到的问题根源在于无格式顺序文件的记录式存储机制:
当你用form='unformatted', access='sequential'打开文件时,gfortran会将每个write语句的输出封装为一个独立的记录,并且为每个记录添加长度标记——这是无格式顺序文件的标准行为。
具体到你的代码:
- 每个循环里的
write(10) null_char只写入1个字节的NUL字符(0x00) - 对于长度≤255字节的短记录,gfortran会在记录的开头和结尾各添加1个字节的长度标记,标记值等于记录的字节长度(这里是1,对应十六进制0x01)
所以每执行一次write,文件里会写入三个字节:0x01(开头标记) + 0x00(NUL字符) + 0x01(结尾标记)。循环1000次后,文件内容就是这三个字节的重复,看起来自然会混杂大量0x01字符。
如果要避免生成这些标记,有两种简单的解决方法:
方法1:使用直接访问无格式文件
修改open语句,指定access='direct'并设置记录长度recl=1,这样每个记录固定1字节,不会添加额外标记:
program writechar implicit none character :: null_char integer :: n null_char=char(0) open(unit=10, file='nullfile', form='unformatted', access='direct', recl=1, status='replace') do n=1,1000 write(10, rec=n) null_char end do close(10) end program
方法2:一次性写入所有数据
把要写入的NUL字符放到数组里,一次性完成写入,这样只会生成一个记录,标记仅在文件开头和结尾各出现一次:
program writechar implicit none character, dimension(1000) :: null_chars integer :: n null_chars = char(0) open(unit=10, file='nullfile', form='unformatted', access='sequential', status='replace') write(10) null_chars close(10) end program
内容的提问来源于stack exchange,提问作者kris44dad
相关产品推荐
相关产品推荐

