ファイルシステムは、Fortran プログラム中の論理ユニット番号を自動的に物理ファイルに関連付けるための機能を持っていません。
しかし、Fortran プログラムにファイル名を渡す方法はいくつかあります。
ライブラリルーチン getarg(3F) を使用して、実行時にコマンド行引数を文字変数に読み込むことができます。引数はファイル名として解釈され、OPEN 文の FILE= 指定子で使用されます。
demo% cat testarg.f CHARACTER outfile*40 C ユニット 51 の出力ファイル名として最初の引数を取得する CALL getarg(1,outfile) OPEN(51,FILE=outfile) WRITE(51,*) 'Writing to file: ', outfile END demo% f95 -o tstarg testarg.f demo% tstarg AnyFileName demo% cat AnyFileName Writing to file: AnyFileName demo% |
同様に、ライブラリルーチン getenv(3F) を使用して、実行時に環境変数の値を文字変数に読み込むことができます。この値はファイル名として解釈されます。
demo% cat testenv.f CHARACTER outfile*40 C ユニット 51 の出力ファイル名として $OUTFILE を取得する CALL getenv('OUTFILE',outfile) OPEN(51,FILE=outfile) WRITE(51,*) 'Writing to file: ', outfile END demo% f95 -o tstenv testenv.f demo% setenv OUTFILE EnvFileName demo% tstenv demo% cat EnvFileName Writing to file: EnvFileName demo% |
getarg または getenv を使用するときには、前後の空白に気をつけるようにしてください。Fortran 95 プログラムは組み込み関数 TRIM を使用でき、古い FORTRAN 77 はライブラリルーチン LNBLNK() を使用できます。この章のはじめにある例の FULLNAME 関数行を用いれば、相対パス名を利用できるようにもプログラムできます。
物理ファイルをプログラムの論理ユニット番号と関連付けるもう 1 つの方法は、あらかじめ接続された標準入出力ファイルをリダイレクトまたはパイプする方法です。リダイレクトやパイプは、実行時の実行コマンド上で行われます。
この方法において、標準入力 (ユニット 5) を読み取り、標準出力 (ユニット 6) か標準エラー (ユニット 0) に書き込むプログラムはリダイレクト、つまりコマンド行上で <, >, >>, >&, |, |&, 2>, 2>&1 を使用することによって、ほかの名前付きファイルを読み取ったり、書き込んだりできます。
これを次の表に示します。
表 2–1 csh/sh/ksh のコマンド行におけるリダイレクトとパイプ
処理 |
C シェルを使用する場合 |
Bourne または Korn シェルを使用する場合 |
---|---|---|
標準入力 — mydata から読み取る |
myprog < mydata |
myprog < mydata |
標準出力 — myoutput に書き込む(上書き) |
myprog > myoutput |
myprog > myoutput |
標準出力 — myoutput に書き込む(追加) |
myprog >> myoutput |
myprog >> myoutput |
標準エラーをファイルにリダイレクトする |
myprog >& errorfile |
myprog 2> errorfile |
標準出力をほかのプログラムの入力としてパイプする |
myprog1 | myprog2 |
myprog1 | myprog2 |
標準エラーと標準出力をほかのプログラムにパイプする |
myprog1 |& myprog2 |
myprog1 2>&1 | myprog2 |
コマンド行におけるリダイレクトとパイプについての詳細は、csh、ksh、および sh のマニュアルページを参照してください。