我在Fortran 90程序中运行一个循环,它为循环的每次迭代输出数值到输出文件。问题是输出没有保存到文件中,而是保存了很多步骤。如何让它冲洗每一步?
示例代码:
open(unit=1,file='output')
do i = 1, 1000
write(1,*) i
end do
close(unit=1)
提前致谢。
答案 0 :(得分:12)
您需要使输出无缓冲。尝试将GFORTRAN_UNBUFFERED_ALL环境变量设置为“y”,“Y”或1。
答案 1 :(得分:6)
另一方面,如果gfortran实现它,则调用非标准子例程flush。并非所有编译器都能实现这一点。
答案 2 :(得分:0)
当我需要刷新时,我只需关闭文件并重新打开。这是笨拙和缓慢的,但我不知道在fortran 90中有更好的方法可以与所有编译器一起使用。
答案 3 :(得分:0)
“ user152979”提出的建议非常出色且很有帮助-十年后!我正在使用MS-DOS Fortran 5.1内置的prgm将程序和数据传输到定制的Z80 SBC(单板计算机)。这个东西是一个小的原型,并且只有串行端口。为了使其与实验性奔腾MMX板(运行MS-DOS)一起使用,我需要一个小的读写程序。 Fortran符合要求,.EXE则适合软盘(MMX板上没有Internet访问权限)。但是,如果我写入COM1端口,则下载到Z80的数据将变得混乱。
结果证明,Fortran正在缓冲数据。在Z80上,我仅获得每10条记录中的一部分。关闭COM1文件(输出设备)并在写入每条文本记录后重新打开,导致缓冲区被刷新,并且小的Fortran下载器(和Z80 SBC)现在可以正常工作。
因此,即使您的Fortran版本不支持“ FLUSH”运算符,也要关闭并立即重新打开文件 可以很好地将缓冲区内容刷新到设备。
关于使用DOS写入COM1端口的附带说明:我必须将串行端口RS-232c的CTS引脚绑在DTR,DCD和DSR引脚上,以便MS-DOS可以“看到”并写入串行端口。在更高版本的MS-DOS(即“ Windows”)中,可以使用MODE命令将COM端口RTS和CTS值设置为OFF,但是对于原始DOS,则需要使用烙铁。并且,您需要在每次记录写入后刷新所有缓冲的数据。 User152979说这种关闭和重新打开是“笨拙且缓慢的”,但就我而言,此技巧非常有效。