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

Standard input and output units in Fortran 90?

提问人:AncientSwordRage 提问时间:12/15/2011 最后编辑:AncientSwordRage 更新时间:10/7/2017 访问量:33988

问:

如何在 Fortran 中读取和写入标准输入、输出和错误流?例如,我听说过写到 ,曾经是 ,单位为 ,我知道写到 的方法是使用 .stdinstdoutstderrstderrwrite(5, fmt=...)5stderrstdoutwrite(*, fmt=...)

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

编译器版本:

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

fortran stdout stdin stderr fortran90

评论

0赞 tpg2114 12/16/2011
哪个版本的 ifort?它们至少在 11.1 及更高版本中支持 F2003。

答:

10赞 tpg2114 12/15/2011 #1

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 编译和运行的。

评论

1赞 tpg2114 12/16/2011
我刚刚用 4 个不同版本的 ifort 尝试了它,它可以工作,它也适用于 gfortran 4.6.0、4.6.1 和 4.6.2。你能发布它给你带来什么错误吗?
0赞 AncientSwordRage 12/16/2011
它不会给我任何错误,但是当我将 stderr 重定向到文件时,什么也没发生。版本为:英特尔(R) Fortran 编译器,适用于在英特尔(R) 64 上运行的应用程序,版本 10.0 Build 20070426 程序包ID: l_fc_p_10.0.023 版权所有 (C) 1985-2007 英特尔公司。保留所有权利。write(0,*)
1赞 Vladimir F Героям слава 10/7/2017
这是特定于编译器的。Fortran 9 标准中不能保证这些数字为 0,5 和 6。
43赞 Chris 12/15/2011 #2

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

在我的输入/输出例程中。虽然这当然意味着预处理您的源文件(要做到这一点,请在编译源代码时使用标志或将源文件扩展名从 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 标准定义的。使用该模块是可移植写入这些单元的正确方法。stderrstdinstdoutifortiso_fortran_env

评论

1赞 Chris 12/15/2011
@Pureferret因此,您可以使用我建议的替代方法之一。此外,最新版本还支持 2003 标准的某些部分,包括 .ifortiso_fortran_env
3赞 Chris 12/16/2011
@Pureferret很高兴听到它起作用。预处理可能非常有用,尽管我没有看到它在 Fortran 代码中经常使用。
4赞 tpg2114 12/16/2011
您还可以更改文件的扩展名。如果是 .F 或 .F90 而不是 .f 或 .f90,则编译器将在没有特殊标志的情况下为您预处理它。
1赞 Chris 5/6/2015
@bela83 感谢您指出这一点。我已经更正了我的答案。令我惊讶的是,以前没有人提到过这一点。
1赞 River 8/12/2015
@Chris您的链接“预处理”已失效。由于这似乎是答案中相当重要的部分,请考虑寻找新的来源进行链接。
17赞 janneb 12/15/2011 #3

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

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

3赞 Petr Pařík 10/7/2017 #4

在 Fortran 中写入的标准方法是用星号代替单元号,即stdout

WRITE(*,fmt) something

或简单地使用

PRINT fmt,something

同样,读取的标准方式是stdin

READ(*,fmt) something

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

单元号 0、5 和 6 肯定可以在编译器(以及其他一些 Fortran 编译器)中工作,但请记住,它们依赖于编译器。ifort