在C中,我可以使用标准函数freopen
和stdout
将程序的标准输出重定向到文件。我想对fortran做同样的事情,但谷歌搜索后我无法找到类似的功能。它存在吗?
如果有人想知道我的用例是什么,为什么我不能只使用shell重定向输出,我运行MPI程序并需要将每个实例的输出重定向到不同的文件。我无法从程序外部执行此操作,因为我们的MPI实现不允许这样做。
编辑:
相关问题如下。假设fortran代码调用C函数,并且此C函数将stdout的freopen调用到另一个文件。 fortran中的后续write(*,*)
,print *
和write(6,*)
会发生什么?这些输出是否重定向到文件?
答案 0 :(得分:2)
如果您有先见之明,可以按照
的顺序编写所有write
语句
write(write_unit,*) stuff_to_write
这很简单,您只需将write_unit
附加到文件而不是stdout
即可。我想你已经知道了,或者你不会问这个问题。如果您的write
语句的格式为
write(*,*)
或
print *
然后你可以在编译器的帮助下重定向输出。例如,英特尔Fortran将指向*
的输出发送到控制台,除非程序发现自己在变量FOR_PRINT
设置为某个文件或其他文件名的环境中执行,在这种情况下{ {1}}将写入该文件。我希望其他编译器具有类似的功能。
如果您的代码使用
write(*,*)
期望单位6点write(6,*)
你可以在文件上打开单位6
stdout
您还可以更好地告诉我们您的写陈述的内容以及您正在使用的编译器。
修改
在OP编辑后提出问题。这不仅仅是一个评论,而是一个答案,但我很啰嗦...... 遗憾的是,从可移植性的角度来看,Fortran程序与底层计算机系统的大部分交互都没有在标准中定义。关于输出到单位open(unit = 6, file = 'stdout_redirect', status = 'new')
的输出位置的问题就是一个例子;最新的(2008)标准说它必须从内在模块*
转到由命名常量output_unit
标识的相同单元。但它没有说它转到iso_fortran_env
(在没有stdout
的系统上有很多Fortran实现)并且它没有指定如何重定向该输出,或者即使它可以这样做。输出的重定向是平台的问题,而不是Fortran。正如我们发现英特尔Fortran可以使用环境变量来重定向输出,显然Cray Fortran不能。
最新的标准完全没有关于文件描述符的主题,我不确定它是Fortran已知的概念。
对i / o使用stdout
实质上是指由输入来自和输出的编译器/运行时系统。如果您想要便携性,则必须控制并使用特定的单元标识。我个人认为你应该在下面的评论中提出@George的建议。