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

Pur*_*ret 27 stdin fortran stdout stderr fortran90

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

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

编译器版本:

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

Chr*_*ris 39

如果你有一个Fortran编译器2003,内在的模块iso_fortran_env定义的变量input_unit,output_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
Run Code Online (Sandbox Code Playgroud)

在我的输入/输出例程中.虽然这当然意味着预处理源文件(用做这个ifort,使用-fpp编译源代码时,标志或更改源文件的扩展名.f.F.f90.F90).

另一种方法是编写自己的非内在iso_fortran_env模块(如果你没有Fortran 2003编译器),如这里所讨论的(此答案发布后此链接已经死亡).在这个例子中,他们使用一个模块:

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
Run Code Online (Sandbox Code Playgroud)

正如其他答案所述,0,5和6 通常都是 stderr,stdin并且stdout(ifort在Linux上也是如此)但Fortran标准并未对此进行定义.使用该iso_fortran_env模块是可移植地写入这些单元的正确方法.

  • 您还可以更改文件的扩展名.如果它是.F或.F90而不是.f或.f90,则编译器将为您预处理它而不使用特殊标志. (4认同)
  • @Pureferret很高兴听到它有效.预处理可能非常有用,虽然我没有看到它经常在Fortran代码中使用. (3认同)

jan*_*neb 13

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

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


tpg*_*114 8

对于stderr来说,它实际上是0.5是stdin,6是stdout.

例如:

PROGRAM TEST
  WRITE(0,*) "Error"
  WRITE(6,*) "Good"
END PROGRAM TEST
Run Code Online (Sandbox Code Playgroud)

得到:

./a.out 
Error
Good
Run Code Online (Sandbox Code Playgroud)

./a.out 2> /dev/null
Good
Run Code Online (Sandbox Code Playgroud)

我会存储一个STDERR = 0的PARAMETER以使其可移植,所以如果你遇到一个不同的平台你就可以改变参数.

此示例是使用ifort 12.1.1.256,11.1.069,11.1.072和11.1.073编译和运行的.