2

在 CI 中可以使用标准函数freopenwithstdout将我的程序的标准输出重定向到文件。我想对 fortran 做同样的事情,但是在谷歌搜索后我找不到类似的功能。它存在吗?

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


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

4

1 回答 1

2

如果你有远见把你所有的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 的建议。

于 2014-09-22T17:47:21.083 回答