インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
内部ファイルと外部ファイルの区別に関係なく、すべてのファイルは、論理デバイスに関連付けられます。ファイルに関連付けられた論理デバイスは、ユニット指定子 (UNIT=) によって識別されます。内部ファイルのユニット指定子は、それに関連付けられた文字変数の名前になります。外部ファイルのユニット指定子は、次のいずれかです。
OPEN 文で割り当てた番号
インテル® Fortran ランタイム・ライブラリーで OPEN 指定子 NEWUNIT= で割り当てられた番号
ユニット指定子としてデバイスに事前結合された番号
アスタリスク (*)
OPEN 文により、ユニット番号と外部ファイルが結合されるので、OPEN 文の指定子を使用してファイル属性とランタイムオプションを明示的に指定することができます。特定のデバイスに事前結合されたユニット指定子は、開く必要がありません。結合した外部ユニットは、プログラムの実行が終了したとき、または CLOSE 文によってユニットが閉じられたときに解除されます。
1 つのユニットを一度に複数のファイルに結合することはできません。また、1 つのファイルを一度に複数のユニットに結合することもできません。すでに開かれているファイルを OPEN 文を使用して開き、結合の I/O オプションの一部を変更することはできますが、すでに開かれているファイルまたはユニットを、他のユニットまたはファイルに結合することはできません。
次の場合を除いて、すべての I/O 文でユニット指定子を使用する必要があります。
ACCEPT: これは、環境変数 FOR_ACCEPT が定義されている場合を除き、常に標準入力から読み取りを行います。
ファイルによる INQUIRE: ファイルが関連付けられているユニットではなく、ファイル名を指定します。
PRINT: これは、環境変数 FOR_PRINT が定義されている場合を除き、常に標準入力から読み取りを行います。
I/O リストと形式指定子のみを含む READ: 環境変数 FOR_READ が定義されている場合を除き、常に標準入力 (UNIT=5) から読み取りを行います。
I/O リストと形式指定子のみを含む WRITE: 環境変数 FOR_WRITE が定義されている場合を除き、常に標準出力に書き込みを行います。
TYPE: これは、環境変数 FOR_TYPE が定義されている場合を除き、常に標準入力から読み取りを行います。
外部ファイルに関連付けられたユニット指定子は、整数式またはアスタリスク (*) でなければなりません。整数式は、0 (ゼロ) から最大値 2,147,483,640 までの範囲でなければなりません。(FOR_K_PRINT_UNITNO、FOR_K_TYPE_UNITNO、FOR_K_ACCEPT_UNITNO、および FOR_K_READ_UNITNO の定義済みパラメーターは、この範囲ではありません。詳細は、「Language Reference」(英語) を参照してください。)
次の例は、外部ファイル UNDAMP.DAT をユニット 10 に結合して、書き込みを行います。
OPEN (UNIT = 10, FILE = 'UNDAMP.DAT') WRITE (10, '(A18,\)') ' Undamped Motion:'
アスタリスク (*) のユニット指定子は、読み取り時にはキーボードを、書き込み時には画面を指定します。次の例は、アスタリスク指定子を使用して画面へ書き込みます。
WRITE (*, '(1X, A30,\)') ' Write this to the screen.'
インテル® Fortran では、以下の図に示すように、4 つのユニットを外部ファイル (デバイス) に事前結合しています。
外部ユニット指定子 |
環境変数 |
説明 |
アスタリスク (*) |
なし |
常にキーボードと画面を表します (FOR_READ などの適切な環境変数が定義されている場合を除く)。 |
0 |
FORT0 |
初期状態では画面を表します (FORT0 が明示的に定義されている場合を除く)。 |
5 |
FORT5 |
初期状態ではキーボードを表します (FORT5 が明示的に定義されている場合を除く)。 |
6 |
FORT6 |
初期状態では画面を表します (FORT6 が明示的に定義されている場合を除く)。 |
アスタリスク (*) 指定子は、別のファイルに再結合することができない唯一のユニット指定子で、このユニットを閉じようとするとコンパイルエラーが発生します。ユニット 0、5、および 6 は、OPEN 文で任意のファイルに結合することができます。これらのユニットのいずれかを閉じた場合は、次にそのユニットを使用する I/O 文が実行される際に、事前結合されたデバイスに自動的に再結合されます。
インテル® Fortran は、stdin へのバッファリングをサポートしていません。また、assume buffered_stdout オプションを指定しない限り、デフォルトでは stdout へバッファリングしません。ユニット * および 6 へのすべての I/O は、デフォルトでライン・バッファリングを使用します。このため、C コードでバッファリングを実行しない限り、C および Fortran の stdout への出力は問題ありません。C コードでバッファリングを行う場合は、各書き込み後にバッファーをフラッシュする必要があります。stdout および stdin の詳細は、「論理ユニットへのファイルの割り当て」を参照してください。
次のいずれかを行って、これらの事前結合ファイルを変更します。
OPEN 文を使用して、ユニット 5、6、または 0 を開きます。ユニット 5、6、または 0 のファイルを明示的に開く場合、OPEN 文キーワードは、標準の事前結合 I/O ファイルの代わりに使用するファイルに関連した情報を指定します。
適切な環境変数 (FORTn) を設定して、I/O を外部ファイルにリダイレクトします。
標準の事前結合ファイルからの入力または出力を実行時にリダイレクトするには、適切な環境変数を設定するかまたはパイプで適切なシェル・リダイレクト文字を使用します (> または < など)。
OPEN 文でファイル名を省略するとき、または OPEN 文を暗黙的に使用するときは、環境変数 FORTn を定義することで、特定のユニット番号 (n) に対して、ファイル名を指定することができます。ただし、fpscomp filesfromcmd オプションが指定されている場合を除きます。
例えば、ユニット 6 を使用して、標準出力の代わりにファイルへ書き込みを行う場合、プログラムを実行する前に、環境変数 FORT6 を使用するパスとファイル名に設定します。適切な環境変数が定義されていなければ、fort.n (n は論理ユニット番号) の形式で、デフォルトのファイル名が使用されます。
次の例では、事前結合されたユニット 6 (画面) に書き込みを行い、次にユニット 6 を外部ファイルに再結合して書き込みを行い、最後に、そのユニットを画面に再結合して書き込みを行います。
REAL a, b
! 画面 (事前結合されたユニット 6) へ書き込む
WRITE(6, '('' This is unit 6'')')
! OPEN 文を使用してユニット 6 を
! 外部ファイル 'COSINES' に接続
OPEN (UNIT = 6, FILE = 'COSINES', STATUS = 'NEW')
DO k = 1, 63, 1
a = k/10
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
内部ファイルに関連付けられたユニット指定子は、スカラーまたは文字配列変数になります。
内部ファイルがスカラー文字変数の場合、ファイルは単一のレコードで構成され、レコードの長さは変数の長さと同じです。
内部ファイルが配列文字変数の場合、ファイルは配列の各要素のレコードで構成され、各レコードの長さは配列の 1 要素の長さと同じです。
内部ファイルを使用するときには、次の規則に従います。
書式仕様、ネームリスト、およびリスト指定 I/O によって書式が設定された I/O など、書式付き I/O だけを使用するようにします。(リスト指定 I/O とネームリスト I/O は書式付きシーケンシャル I/O として扱われます)
文字変数が割付け配列、または割付け配列の部分配列である場合、内部ファイルとして使用される前に、その配列は割り当てられている必要があります。文字変数がポインターである場合は、その変数はポインターの指示先に関連付けられている必要があります。
READ および WRITE 文のみを使用します。内部ファイルでは、ファイル結合 (OPEN、CLOSE) 文、ファイル位置の指定 (REWIND、BACKSPACE) 文またはファイル照会 (INQUIRE) 文を使用できません。
FORMAT I/O 文、ネームリスト 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')