如何在每次使用gfortran Fortran 90程序写入后将输出刷新到文件?

如何在每次使用gfortran Fortran 90程序写入后将输出刷新到文件?,fortran,flush,gfortran,Fortran,Flush,Gfortran,我在Fortran 90程序中运行一个循环,该程序为循环的每次迭代向输出文件输出数值。问题是输出不是保存到文件中,而是每隔这么多步骤保存一次。我如何让它冲洗每一步 示例代码: open(unit=1,file='output') do i = 1, 1000 write(1,*) i end do close(unit=1) 提前感谢。您需要使输出无缓冲。尝试将环境变量设置为“y”、“y”或1。如果gfortran实现了它,则另一种方法是调用非标准子例程flush。并非所有的编译器都能实

我在Fortran 90程序中运行一个循环,该程序为循环的每次迭代向输出文件输出数值。问题是输出不是保存到文件中,而是每隔这么多步骤保存一次。我如何让它冲洗每一步

示例代码:

open(unit=1,file='output')

do i = 1, 1000
 write(1,*) i
end do

close(unit=1)

提前感谢。

您需要使输出无缓冲。尝试将环境变量设置为“y”、“y”或1。

如果gfortran实现了它,则另一种方法是调用非标准子例程flush。并非所有的编译器都能实现这一点。

当我需要刷新时,我只需关闭文件并重新打开。这既笨拙又缓慢,但我不知道在fortran 90中有哪种更好的方法能适用于所有编译器。

来自“user152979”的建议非常好而且很有帮助——10年后!我正在使用MS-DOS Fortran 5.1构建的prgm将程序和数据传输到定制的Z80 SBC(单板计算机)。这个东西是一个小原型,只有串口。为了让它与实验性的奔腾MMX板(运行MS-DOS)一起工作,我需要一个小的读写程序。Fortran符合要求,而.EXE可以放在软盘上(MMX板上不能访问internet)。但是如果我写COM1端口,下载到Z80的数据就会被扰乱

原来Fortran正在缓冲数据。在Z80上,我只获得了大约每10张唱片的一部分。关闭COM1文件(输出设备)并在写入每条文本记录后重新打开,导致缓冲区被刷新,小Fortran downloader(和Z80 SBC)现在可以正常工作

因此,即使您的Fortran版本不支持“FLUSH”操作符,也要关闭并立即重新打开文件 工作正常,可将缓冲区内容刷新到设备


关于使用DOS写入COM1端口的旁注:我必须将串行端口RS-232c引脚CT捆绑到引脚DTR、DCD和DSR上,以便MS-DOS能够“看到”并写入串行端口。在更高版本的MS-DOS(即“Windows”)中,您可以使用MODE命令将COM端口RTS和CTS值设置为OFF,但在原始DOS中,您需要使用烙铁。在每次记录写入之后,您需要刷新所有缓冲数据。User152979说这种关闭和重新打开“既笨拙又缓慢”,但在我的例子中,这个技巧非常有效

我会在bash中这样做吗:GFORTRAN_UNBUFFERED_ALL='y'导出$GFORTRAN_UNBUFFERED_ALL?只是好奇?是的,虽然您不需要在导出行中使用“$”。这将一直工作到您退出当前shell。如果您想永久性地使用这种行为,您可能需要将这些行添加到
.bashrc
文件中。我尝试了以下方法,并键入了:GFORTRAN_UNBUFFERED_ALL='y'export GFORTRAN_UNBUFFERED_ALL echo$GFORTRAN_UNBUFFERED_ALL echo打印了正确的值。我用“y”、“y”和1试过这个。这些问题都没有解决。不过,谢谢你的建议。对我来说,这很好,谢谢你的建议@帕特里克:你找到为什么这对你不起作用了吗?
FLUSH
作为一个子程序(如
call FLUSH()
)是非标准的,但是
FLUSH
语句是有效的Fortran 2003:
FLUSH(10)
,来自GNU网站,它说:FLUSH内在语句和Fortran 2003 FLUSH语句具有相同的效果:它们刷新运行时库的I/O缓冲区,以便数据对其他进程可见。这并不保证数据被提交到磁盘。