2014-09-22 105 views
1

在C中,我可以使用标准函数freopenstdout将我的程序的标准输出重定向到一个文件。我想用fortran做同样的事情,但是在Google搜索后我找不到类似的功能。它存在吗?Fortran相当于freopen

如果有人想知道我的用例是什么,以及为什么我不能使用shell重定向输出,我正在运行MPI程序,并且需要将每个实例的输出重定向到不同的文件。我不能从程序之外做到这一点,因为我们的MPI实施不允许这样做。


编辑: 一个相关的问题如下。假设Fortran代码调用一个C函数,并且这个C函数调用stdout的freopen到一个不同的文件。在fortran中,随后的write(*,*),print *write(6,*)会发生什么?这些文件的输出是否重定向到文件?

+1

至于你添加的问题 - 你尝试这个时发现了什么? – 2014-09-23 05:29:53

+0

那么,我发现的是非常不相关的,因为我需要可移植性和可移植性由标准来保证。我可能需要知道如何根据fortan标准处理文件描述符,但我不确定这些影响可能是什么。不过,你应该得到一个答案......是的,它的工作。所有后续输出按预期重定向到文件。 – Spiros 2014-09-23 07:58:31

回答

2

如果你有先见之明写沿

write(write_unit,*) stuff_to_write 

行所有write声明这将是非常简单的,你可以简单地连接到write_unit文件而不是stdout。我想你已经知道,或者你不会问这个问题。如果您write语句的形式为

write(*,*) 

print * 

那么你或许可以重定向输出从编译器的帮助不大。例如,英特尔Fortran会将指向*的输出发送到控制台,除非程序发现自己在变量FOR_PRINT设置为某个文件或其他文件的名称的环境中执行,在这种情况下,write(*,*)将写入该文件。我希望其他编译器具有类似的功能。

如果你的代码的预期使用

write(6,*) 

该单位6点stdout你可以在一个文件

open(unit = 6, file = 'stdout_redirect', status = 'new') 

打开单元6对于任何更多你最好告诉我们,你写语句看起来像你正在使用的编译器。

编辑

在OP的编辑问题后。这是一个评论比答案更多,但我很啰嗦......

不幸的是,从可移植性的角度来看,许多Fortran程序与底层计算机系统的交互没有在标准中定义。你的问题在哪里输出发送到单位*去是一个例子;最新的(2008)标准指出,它必须与内在模块iso_fortran_env中的命名常量output_unit确定的单位相同。但是它并没有说到stdout(在没有stdout的系统上已经有很多Fortran实现),并且它没有指定如何重定向该输出,或者即使可以这样做。输出重定向是平台问题,而不是Fortran。正如我们发现英特尔Fortran可以使用环境变量重定向输出,显然Cray Fortran不能。

最新标准完全没有提到文件描述符的主题,我不确定它是Fortran已知的概念。

对于I/O使用*实质上是说它取决于编译器/运行时系统,输入来自输出并转到输出。如果你想要可移植性,你必须控制并使用特定的单元标识。就我个人而言,我认为你应该在下面的评论中采纳@乔治的建议。

+2

如果您没有足够的远见来使用单位编号的变量,请咬住子弹并返回并修复它。其他任何事情都是在mpi下要求麻烦。 – agentp 2014-09-22 17:52:14

+0

恩,挺@george。并感谢您提供明确的,我不认为明确的内容。 – 2014-09-22 17:54:59

+0

非常感谢您的提示。我正在使用的代码库非常大(大约5万行),风格和实践方面非常不同。关于如何打印东西没有普遍的一致意见,主要是因为只有诊断消息被打印到标准输出(并且诊断消息被认为没有什么相关性)。我看到你的解决方案,并认为它们都不适合我的情况,原因在于没有这样做的标准方式。我针对的编译器是GCC和Cray。 – Spiros 2014-09-22 23:36:12