2011-12-14 89 views
19

如何在Fortran中读写标准输入,输出和错误流stdinstdoutstderr?我听说写过stderr,例如,使用write(5, fmt=...),其中5的单位为stderr,我知道写stdout的方法是使用write(*, fmt=...)Fortran 90中的标准输入和输出单元?

如何使用ifort编译器读写标准输入和输出单元?

编译器版本:

英特尔(R)Fortran编译器英特尔(R)64,10.0版构建20070426包ID运行的应用程序:l_fc_p_10.0.023版权所有(C)1985-2007英特尔公司。保留所有权利

+0

哪个版本的ifort?至少从11.1版开始,他们至少支持F2003。 – tpg2114 2011-12-15 23:00:00

回答

33

如果你有一个Fortran编译器2003,内在模块iso_fortran_env定义变量input_unitoutput_uniterror_unit分别指向标准,标准输出和标准错误。

我倾向于使用类似

#ifdef f2003 
use, intrinsic :: iso_fortran_env, only : stdin=>input_unit, & 
              stdout=>output_unit, & 
              stderr=>error_unit 
#else 
#define stdin 5 
#define stdout 6 
#define stderr 0 
#endif 
在我的输入/输出程序

。虽然这当然意味着您的源文件(要在ifort上执行此操作,请在编译源代码时使用-fpp标志或将源文件扩展名从.f更改为.F或从.f90更改为.F90)。

这另一种方法是写自己的,非本质,iso_fortran_env模块(如果你没有一个Fortran编译器2003),所讨论的here(此链接已去世,因为这个答案被张贴) 。在这个例子中,他们使用的模块:

module iso_fortran_env 

    ! Nonintrinsic version for Lahey/Fujitsu Fortran for Linux. 
    ! See Subclause 13.8.2 of the Fortran 2003 standard. 

    implicit NONE 
    public 

    integer, parameter :: Character_Storage_Size = 8 
    integer, parameter :: Error_Unit = 0 
    integer, parameter :: File_Storage_Size = 8 
    integer, parameter :: Input_Unit = 5 
    integer, parameter :: IOSTAT_END = -1 
    integer, parameter :: IOSTAT_EOR = -2 
    integer, parameter :: Numeric_Storage_Size = 32 
    integer, parameter :: Output_Unit = 6 

end module iso_fortran_env 

在其他的答案所指出的,0,5和6是通常stderrstdinstdout(这是真的为ifort Linux上),但是这是由Fortran标准定义。使用iso_fortran_env模块是可移植写入这些单元的正确方法。

5

它实际上是0的stderr。 5是stdin,6是stdout。

例如:

PROGRAM TEST 
    WRITE(0,*) "Error" 
    WRITE(6,*) "Good" 
END PROGRAM TEST 

给出:

./a.out 
Error 
Good 

./a.out 2> /dev/null 
Good 

我将存储的参数是STDERR = 0,使其便携,所以如果你打一个不同的平台,你可以改变参数。

本例使用ifort 12.1.1.256,11.1.069,11.1.072和11.1.073进行编译和运行。

+0

我试过这个,它不起作用。 – Pureferret 2011-12-15 22:54:28

+0

我只是试了4个不同版本的ifort,它的工作原理,它也适用于gfortran 4.6.0,4.6.1和4.6.2。你能发布它给你的错误吗? – tpg2114 2011-12-15 23:07:25

12

Fortran标准没有指定哪些单元编号对应于stdin/out/err。通常的惯例,接着是例如gfortran,是stderr = 0,stdin = 5,stdout = 6。

如果您的编译器支持F2003 ISO_FORTRAN_ENV内在模块,那么该模块包含常量INPUT_UNIT,OUTPUT_UNIT和ERROR_UNIT,允许程序员可移植地检索预连接单元的单元号。

0

的标准方式写入stdout用Fortran是把星号代替单元数目,即,

WRITE(*,fmt) something 

或简单地使用

PRINT fmt,something 

类似地,标准的方法来从stdin读取的是

READ(*,fmt) something 

没有标准d写入stderr的方式,除非您使用ISO_FORTRAN_ENV模块中的ERROR_UNIT模块,该模块需要Fortran 2003或更高版本。

编号为0,5和6的编译器肯定会在编译器(以及其他一些Fortran编译器)中工作,但请记住它们依赖于编译器。

相关问题