首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran等价于freopen

Fortran等价于freopen
EN

Stack Overflow用户
提问于 2014-09-22 16:52:49
回答 1查看 244关注 0票数 2

在C语言中,我可以使用标准函数freopenstdout将程序的标准输出重定向到文件中。我也想对fortran做同样的事情,但是在googled之后我找不到类似的特性。它存在吗?

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

编辑:相关问题如下。假设fortran代码调用一个C函数,这个C函数将stdout的freopen调用到另一个文件。接下来的fortran中的write(*,*)print *write(6,*)会发生什么呢?这些输出是否重定向到文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-22 17:47:21

如果您有远见地编写所有write语句,请按照

代码语言:javascript
复制
write(write_unit,*) stuff_to_write

这将非常简单,您可以简单地将write_unit附加到一个文件,而不是stdout。我想你已经知道了,否则你就不会问这个问题了。如果您的write语句为窗体

代码语言:javascript
复制
write(*,*) 

代码语言:javascript
复制
print *

然后,您可能可以在编译器的帮助下重定向输出。例如,Intel将指向*的输出发送到控制台,除非程序发现自己在一个将变量FOR_PRINT设置为某个文件名的环境中执行,在这种情况下,write(*,*)将写入该文件。我希望其他编译器也有类似的功能。

如果您的代码使用

代码语言:javascript
复制
write(6,*)

在期望单元6点在stdout时,您可以在文件上打开单元6

代码语言:javascript
复制
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实质上是说,输入来自编译器/运行时系统,而输出则由编译器/运行时系统决定。如果您想要可移植性,您必须控制并使用特定的单元标识。就我个人而言,我认为你应该在下面的评论中采纳乔治的建议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25979230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档