web-dev-qa-db-ja.com

Fortran 90の標準入出力ユニット?

Fortranで標準入力、出力、エラーストリームstdinstdoutstderrを読み書きするにはどうすればよいですか? stderrへの書き込みを聞いたことがあります。たとえば、usedwrite(5, fmt=...)、_5_ stderrのユニットです。stdoutに書き込む方法はwrite(*, fmt=...)を使用することです。

ifortコンパイラを使用して標準の入力ユニットと出力ユニットに読み書きするにはどうすればよいですか?

コンパイラーのバージョン:

インテル(R)64、バージョン10.0ビルド20070426で実行されているアプリケーション用のインテル(R)FortranコンパイラパッケージID:l_fc_p_10.0.023 Copyright(C)1985-2007 Intel Corporation。全著作権所有

27
Pureferret

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
_

私の入出力ルーチンで。これはもちろん 前処理 ソースファイルを意味します(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
_

他の回答で述べたように、0、5、6は通常ですstderrstdinおよびstdout(これは当てはまります) Linuxではifort)ですが、これはFortran規格で定義されているではありません。 _iso_fortran_env_モジュールを使用すると、これらのユニットに移植可能に書き込むことができます。

40
Chris

Fortran規格は、stdin/out/errに対応するユニット番号を指定していません。通常の規則、その後に続くgfortranは、stderr = 0、stdin = 5、stdout = 6です。

コンパイラがF2003 ISO_FORTRAN_ENV組み込みモジュールをサポートしている場合、そのモジュールには定数INPUT_UNIT、OUTPUT_UNIT、およびERROR_UNITが含まれており、プログラマは事前接続されたユニットのユニット番号を移植可能に取得できます。

13
janneb

Stderrの場合、実際には0です。 5は標準入力、6は標準出力です。

例えば:

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でコンパイルおよび実行されました。

8
tpg2114

Fortranでstdoutに書き込む標準的な方法は、ユニット番号の代わりにアスタリスクを付けることです。つまり、

WRITE(*,fmt) something

または単に使用する

PRINT fmt,something

同様に、stdinから読み取る標準的な方法は次のとおりです。

READ(*,fmt) something

Fortran 2003以降を必要とするERROR_UNITモジュールからISO_FORTRAN_ENVを使用しない限り、stderrに書き込む標準的な方法はありません。

ユニット番号0、5、6はifortコンパイラー(および他の一部のFortranコンパイラー)でも確実に機能しますが、コンパイラーに依存することに注意してください。

1
Petr Pařík