内部ファイルと外部ファイルの区別を問わず,すべてのファイルは,論理装置に関連付けられています。ファイルに関連付けられた論理装置は装置指定子 (UNIT=) を使って識別します。内部ファイルの装置指定子は,それに関連付けられた文字変数です。外部ファイルの装置指定子は,OPEN 文で割り付けた番号,装置に対して装置指定子として事前接続された数値,または星印 (*) です。
特定の装置に事前接続された外部装置指定子は,開く必要はありません。プログラマが接続した外部装置は,プログラムの実行が終了したとき,または CLOSE 文で装置が閉じられたときに切断されます。
1 つの装置を 1 度に複数のファイルに接続することはできず,1 つのファイルを 1 度に複数の装置に接続することはできません。すでに開かれているファイルを開くことはできますが,これは接続の I/O オプションの一部を変更するためにしか使用できず,すでに開かれたファイルまたは装置を,別の装置またはファイルに接続することはできません。
次の 6 つの場合を除いて,すべての I/O 文で装置指定子を使用する必要があります。
これは,FOR_ACCEPT 環境変数が定義されている場合を除き,つねに標準入力から読み取りを行います。
ファイルが関連付けられている装置ではなく,ファイル名を指定します。
FOR_PRINT 環境変数が定義されている場合を除き,つねに標準出力に書き出しを行います。
FOR_READ 環境変数が定義されている場合を除き,つねに標準入力 (UNIT=5) から読み取りを行います。
FOR_PRINT 環境変数が定義されている場合を除き,つねに標準出力に書き出しを行います。
FOR_TYPE 環境変数が定義されている場合を除き,つねに標準出力に書き出しを行います。
外部ファイル
外部ファイルに関連付けられた装置指定子は,整数式か星印 (*) でなくてはなりません。整数式は,0 (ゼロ) から最大値 2,147,483,640 までの範囲でなくてはなりません。次の例は,外部ファイル UNDAMP.DAT を装置 10 に接続し,書き出しを行っています。
OPEN (UNIT = 10, FILE = 'undamp.dat') WRITE (10, '(A18,\)') ' Undamped Motion:'
星印 (*) の装置指定子は,読み取り時にはキーボードを,書き出し時には画面を指定します。次の例は,画面への書き出しに星印指定子を使用しています。
WRITE (*, '(1X, A30,\)') ' Write this to the screen.'
Visual Fortran は,次表に示すように,4 つの装置を外部ファイル (装置) に事前接続しています。
外部装置指定子 | 説明 |
星印 (*) | つねにキーボードと画面を表します (FOR_READ などの適切な環境変数が定義されている場合を除く)。 |
0 | 初期状態では画面を表します (FORT0 が定義されている場合を除く)。 |
5 | 初期状態ではキーボードを表します (FORT5 が定義されている場合を除く)。 |
6 | 初期状態では画面を表します (FORT6 が定義されている場合を除く)。 |
星印 (*) 指定子は,別のファイルに再接続することができない唯一の装置指定子で,この装置を閉じようと試みるとコンパイル・エラーが発生します。ただし,装置 0,5,および 6 は OPEN 文で任意のファイルに接続することができます。装置 0,5,または 6 を閉じると,次にその装置を使用する I/O 文が試みられた時点で,自動的に対応する装置に再接続されます。
OPEN 文でファイル名を省略するか,暗黙の OPEN を使用するときには,環境変数 FORTn を使って,特定の装置番号 (n) のファイル名を指定することができます (コンパイラ・オプション /fpscomp:filesfromcmd が指定されていない場合を除く)。たとえば,装置 6 で,標準出力の代わりにファイルへの書き出しを行いたい場合,プログラムを実行する前に,環境変数 FORT6 を使用するパスとファイル名に設定します。
次の例は,事前接続された装置 6 (画面) に書き出しを行い,次に装置 6 を外部ファイルに再接続して書き出しを行い,最後に装置 6 を画面に再接続して書き出しを行います。
REAL a, b ! 画面に出力します (装置番号 6 に事前接続)。 WRITE(6, '('' This is unit 6'')') ! 外部ファイル名 'COSINES' に装置番号 6 を接続するため ! OPEN 文を使います。 OPEN (UNIT = 6, FILE = 'COSINES', STATUS = 'NEW') DO a = 0.1, 6.3, 0.1 b = COS (a) ! ファイル 'COSINES' に書き出します。 WRITE (6, 100) a, b 100 FORMAT (F3.1, F5.2) END DO ! 装置を閉じます。 CLOSE (6) ! 書き出しを行うことにより,装置番号 6 に再接続します。 WRITE(6,' ('' Cosines completed'')') END
内部ファイル
内部ファイルに関連付けられた装置指定子は,文字列または文字配列です。内部ファイルには 2 つの形式があります。
これは,その変数,配列要素,または文字以外の配列要素と同じ長さを持ちます。
記録順序は配列要素または型要素の順序と同じで,記録長は配列要素 1 つの長さまたは構造型要素の長さです。
内部ファイルを使用するときには,次の規則に従います。
書式指定と並び I/O で書式設定された I/O を含む,書式付き I/O だけを使用するようにします。並び I/O は書式付き順番 I/O として扱われます。変数群書式指定は許されません。
文字変数が割付け配列,または割付け配列の部分配列である場合,その配列は内部ファイルが使用される前に割り付けられていなくてはなりません。文字変数がポインタである場合,指示先に関連付けられていなくてはなりません。
READ 文と WRITE 文だけを使用します。内部ファイルでは,ファイル接続 (OPEN,CLOSE) 文,ファイルの位置指定 (REWIND,BACKSPACE) 文,またはファイル問合せ (INQUIRE) 文は使用できません。
FORMAT I/O 文と並び I/O 文による内部ファイルの読み書きは,外部ファイルの場合とまったく同じように行えます。I/O 文が実行される前に,内部ファイルの位置は,その先頭の第 1 記録の前に設定されます。
内部ファイルでは,I/O システムの書式指定機能を使って,外部文字表現と Fortran 内部メモリー表現間で値を変換することができます。つまり,内部ファイルからの読み取りでは,ASCII 表現を数値,論理,または文字表現に変換し,内部ファイルへの書き出しでは,これらの表現を ASCII 表現に変換します。
この機能により,文字列をその正確な書式を知らなくても読み取り,文字列を確認し,その内容を解釈することができます。また,ダイアログボックス中などで,ユーザーに文字列を入力させ,アプリケーション内でその文字列を数値として解釈するというようなことが可能になります。
内部ファイルに対して記録全体が書き出されなかった場合,記録の残りの部分には空白が格納されます。
次の例の str と fname は内部ファイルを指定しています。
CHARACTER(10) str INTEGER n1, n2, n3 CHARACTER(14) fname INTEGER i str = " 1 2 3" ! 並び READ は,n1 = 1, n2 = 2, n3 = 3 を設定します。 READ(str, *) n1, n2, n3 i = 4 ! 書式付きWRITEは,fname = 'FM004.DAT' を設定します。 WRITE (fname, 200) i 200 FORMAT ('FM', I3.3, '.DAT')