如果你有远见把你所有的write
陈述都写成
write(write_unit,*) stuff_to_write
这将非常简单,您可以简单地附加write_unit
到文件而不是stdout
. 我猜你已经知道了,否则你不会问这个问题。如果您的write
陈述具有以下形式
write(*,*)
或者
print *
那么您可能可以在编译器的帮助下重定向输出。例如,英特尔 Fortran 将输出定向到*
控制台,除非程序发现自己在环境中执行,变量FOR_PRINT
设置为某个文件或其他文件的名称,在这种情况下write(*,*)
将写入该文件。我希望其他编译器也有类似的能力。
如果您的代码使用
write(6,*)
期望单元 6 指向stdout
您可以打开文件中的单元 6
open(unit = 6, file = 'stdout_redirect', status = 'new')
对于更多信息,您最好告诉我们您的 write 语句是什么样的以及您正在使用什么编译器。
编辑
在OP对问题的编辑之后。这更像是一个评论而不是一个答案,但我很啰嗦......
遗憾的是,从可移植性的角度来看,标准中没有定义 Fortran 程序与底层计算机系统的大部分交互。您关于发送到单元的输出到*
哪里的问题就是一个很好的例子;最新的(2008 年)标准规定,它必须使用output_unit
与内部模块中的命名常量标识的相同单元iso_fortran_env
。但它并没有说它会去stdout
(在没有 a 的系统上已经有很多 Fortran 实现stdout
)并且它没有指定如何重定向该输出,或者即使可以这样做。输出的重定向是平台的问题,而不是 Fortran。正如我们发现的那样,英特尔 Fortran 可以使用环境变量来重定向输出,显然 Cray Fortran 不能。
最新标准对文件描述符的主题完全保持沉默,我不确定这是 Fortran 已知的概念。
使用*
for i/o 本质上是说它取决于输入来自和输出的编译器/运行时系统。如果您想要便携性,您必须控制并使用特定的单元标识。我个人认为你应该在下面的评论中接受@george 的建议。