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_unit
并error_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
模块是可移植地写入这些单元的正确方法.
jan*_*neb 13
Fortran标准没有指定哪些单元号对应于stdin/out/err.通常的惯例,例如gfortran,是stderr = 0,stdin = 5,stdout = 6.
如果编译器支持F2003 ISO_FORTRAN_ENV内部模块,则该模块包含常量INPUT_UNIT,OUTPUT_UNIT和ERROR_UNIT,允许程序员可移植地检索预连接单元的单元号.
对于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编译和运行的.
归档时间: |
|
查看次数: |
24316 次 |
最近记录: |