Fortran 90中的标准输入和输出单元?

时间:2011-12-14 17:05:10

标签: fortran stdout stdin stderr fortran90

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

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

编译器版本:

  

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

4 个答案:

答案 0 :(得分:38)

如果您有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

在我的输入/输出例程中。虽然这当然意味着preprocessing您的源文件(使用ifort执行此操作),但在编译源代码时使用-fpp标志或将源文件扩展名从.f更改为.F .f90.F90iso_fortran_env)。

另一种方法是编写自己的非内在的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 模块(如果你没有Fortran 2003编译器),正如所讨论的here (此答案发布后此链接已经死亡)。在此示例中,他们使用模块:

stderr

正如其他答案中所述,0,5和6 通常是 stdinstdoutifortiso_fortran_env也是如此在Linux上)但这是Fortran标准定义的。使用{{1}}模块是可移植地写入这些单元的正确方法。

答案 1 :(得分:13)

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

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

答案 2 :(得分:8)

stderr实际上是0。 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的PARAMETER以使其可移植,因此如果您点击不同的平台,您只需更改参数即可。

使用ifort 12.1.1.256,11.1.069,11.1.072和11.1.073编译并运行此示例。

答案 3 :(得分:1)

在Fortran中写入stdout的标准方法是放一个星号而不是单位号,即

WRITE(*,fmt) something

或简单地使用

PRINT fmt,something

同样,从stdin读取的标准方法是

READ(*,fmt) something

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

单元号0,5和6肯定可以在ifort编译器(以及其他一些Fortran编译器)中使用,但请记住它们与编译器有关。