Fortran文件实时写入问题:循环迭代无法实时写入数据
解决Fortran文件实时写入的问题
这个需求完全可行,问题根源在于Fortran默认的文件输出缓冲机制——为了提升IO效率,程序会把要写入文件的数据暂存在内存缓冲区中,只有当缓冲区填满或者程序结束时,才会一次性把数据写入磁盘。要实现每次迭代都实时写入,只需要强制刷新缓冲区即可,有两种常用方法:
方法一:每次写入后手动刷新缓冲区
在每次write语句之后添加flush(unit)语句,强制将缓冲区中的数据立即写入磁盘。修改后的代码如下:
program test implicit none real,dimension(5) ::x integer ::i x = (/1, 2, 3, 4, 5/) open(unit=40,file="test.dat") do i=1,5 read(*,*) write(40,*)x(i)**2 flush(40) ! 强制刷新缓冲区,实时写入磁盘 end do close(unit=40) end program
方法二:打开文件时禁用缓冲
在open语句中添加UNBUFFERED='YES'参数(不同编译器语法可能略有差异,比如部分编译器支持BUFFERED='NO'),直接关闭文件的缓冲机制,这样所有写入操作都会实时同步到磁盘:
program test implicit none real,dimension(5) ::x integer ::i x = (/1, 2, 3, 4, 5/) open(unit=40,file="test.dat", UNBUFFERED='YES') ! 禁用缓冲 do i=1,5 read(*,*) write(40,*)x(i)**2 end do close(unit=40) end program
两种方法各有优劣:方法一灵活性更高,可以按需控制刷新时机;方法二则全程无缓冲,适合需要持续实时写入的场景,但会牺牲一点IO效率。
内容的提问来源于stack exchange,提问作者MrEpic0
相关产品推荐
相关产品推荐

