提问人:AncientSwordRage 提问时间:12/15/2011 最后编辑:AncientSwordRage 更新时间:10/7/2017 访问量:33988
Fortran 90 中的标准输入和输出单元?
Standard input and output units in Fortran 90?
问:
如何在 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 英特尔公司。版权所有
答:
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 编译和运行的。
评论
write(0,*)
如果您有 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
在我的输入/输出例程中。虽然这当然意味着预处理您的源文件(要做到这一点,请在编译源代码时使用标志或将源文件扩展名从 to 或从 to 更改为 )。ifort
-fpp
.f
.F
.f90
.F90
另一种方法是编写自己的非内部模块(如果您没有 Fortran 2003 编译器),如此处所述(此链接已在此答案发布后已失效)。在此示例中,他们使用一个模块: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
正如其他答案中所指出的,0、5 和 6 通常是 和(在 Linux 上也是如此),但这不是由 Fortran 标准定义的。使用该模块是可移植写入这些单元的正确方法。stderr
stdin
stdout
ifort
iso_fortran_env
评论
ifort
iso_fortran_env
Fortran 标准没有指定哪些单位编号对应于 stdin/out/err。通常的约定,例如gfortran,是stderr=0,stdin=5,stdout=6。
如果编译器支持 F2003 ISO_FORTRAN_ENV内部模块,则该模块包含常量 INPUT_UNIT、OUTPUT_UNIT 和 ERROR_UNIT,从而允许程序员可移植检索预连接单元的单元号。
在 Fortran 中写入的标准方法是用星号代替单元号,即stdout
WRITE(*,fmt) something
或简单地使用
PRINT fmt,something
同样,读取的标准方式是stdin
READ(*,fmt) something
除非您从模块中使用,否则没有标准的写入方法,这需要 Fortran 2003 或更高版本。stderr
ERROR_UNIT
ISO_FORTRAN_ENV
单元号 0、5 和 6 肯定可以在编译器(以及其他一些 Fortran 编译器)中工作,但请记住,它们依赖于编译器。ifort
评论