在C语言中,我可以使用标准函数freopen和stdout将程序的标准输出重定向到文件中。我也想对fortran做同样的事情,但是在googled之后我找不到类似的特性。它存在吗?
如果有人想知道我的用例是什么,以及为什么我不能使用shell重定向输出,我正在运行一个MPI程序,需要将每个实例的输出重定向到不同的文件。我不能在程序之外这样做,因为我们的MPI实现不允许这样做。
编辑:相关问题如下。假设fortran代码调用一个C函数,这个C函数将stdout的freopen调用到另一个文件。接下来的fortran中的write(*,*)、print *和write(6,*)会发生什么呢?这些输出是否重定向到文件?
发布于 2014-09-22 17:47:21
如果您有远见地编写所有write语句,请按照
write(write_unit,*) stuff_to_write这将非常简单,您可以简单地将write_unit附加到一个文件,而不是stdout。我想你已经知道了,否则你就不会问这个问题了。如果您的write语句为窗体
write(*,*) 或
print *然后,您可能可以在编译器的帮助下重定向输出。例如,Intel将指向*的输出发送到控制台,除非程序发现自己在一个将变量FOR_PRINT设置为某个文件名的环境中执行,在这种情况下,write(*,*)将写入该文件。我希望其他编译器也有类似的功能。
如果您的代码使用
write(6,*)在期望单元6点在stdout时,您可以在文件上打开单元6
open(unit = 6, file = 'stdout_redirect', status = 'new')还有,您最好告诉我们您的写语句是什么样子的,以及您使用的编译器是什么。
编辑
在OP编辑成问题之后。这与其说是回答,不如说是评论,但我很长篇大论.
遗憾的是,从可移植性的角度来看,Fortran程序与底层计算机系统的交互大部分都没有在标准中定义。您关于输出发送到单元* go的位置的问题就是一个很好的例子;最新的(2008)标准指出,它必须到达由内部模块iso_fortran_env中的命名常量output_unit标识的同一个单元。但是它并没有提到stdout (在没有stdout的系统上已经有了大量的Fortran实现),它也没有指定如何重定向输出,甚至可以这样做。重定向输出是平台的问题,而不是Fortran。正如我们所发现的,Intel Fortran可以使用环境变量重定向输出,显然Cray Fortran不能。
最新的标准完全没有提到文件描述符的主题,我不确定这是Fortran所知道的一个概念。
使用* for i/o实质上是说,输入来自编译器/运行时系统,而输出则由编译器/运行时系统决定。如果您想要可移植性,您必须控制并使用特定的单元标识。就我个人而言,我认为你应该在下面的评论中采纳乔治的建议。
https://stackoverflow.com/questions/25979230
复制相似问题