如何在Fortran中读取和写入标准输入,输出和错误流stdin
,stdout
和stderr
?我听说写过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英特尔公司。保留所有权利
答案 0 :(得分:38)
如果您有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
在我的输入/输出例程中。虽然这当然意味着preprocessing您的源文件(使用ifort
执行此操作),但在编译源代码时使用-fpp
标志或将源文件扩展名从.f
更改为.F
.f90
或.F90
至iso_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 通常是 stdin
,stdout
和ifort
(iso_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编译器)中使用,但请记住它们与编译器有关。