Fortranで標準入力、出力、エラーストリームstdin
、stdout
、stderr
を読み書きするにはどうすればよいですか? stderr
への書き込みを聞いたことがあります。たとえば、usedがwrite(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。全著作権所有
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は通常ですstderr
、stdin
およびstdout
(これは当てはまります) Linuxではifort
)ですが、これはFortran規格で定義されているではありません。 _iso_fortran_env
_モジュールを使用すると、これらのユニットに移植可能に書き込むことができます。
Fortran規格は、stdin/out/errに対応するユニット番号を指定していません。通常の規則、その後に続くgfortranは、stderr = 0、stdin = 5、stdout = 6です。
コンパイラがF2003 ISO_FORTRAN_ENV組み込みモジュールをサポートしている場合、そのモジュールには定数INPUT_UNIT、OUTPUT_UNIT、およびERROR_UNITが含まれており、プログラマは事前接続されたユニットのユニット番号を移植可能に取得できます。
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でコンパイルおよび実行されました。
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コンパイラー)でも確実に機能しますが、コンパイラーに依存することに注意してください。