装置とは、外部ファイルを参照する手段です。プログラムは、I/O ステートメント内の装置指定子として指定した装置番号によって、外部ファイルを参照します。装置指定子の形式については、[UNIT=] を参照してください。
装置と外部ファイルの間の関連付けを接続といいます。接続が行われてからでなければ、ファイルのレコードを読み取ることも、書き込むこともできません。
ファイルと装置を接続するには、次の 3 つの方法があります。
事前接続は、プログラムの実行が開始されると、一度行われます。事前接続された装置は、事前に OPEN ステートメントを実行しなくても、I/O ステートメントで指定することができます。
+----------------------------------IBM 拡張----------------------------------+
装置 0、5、および 6 が定様式順次アクセス用の名前なしファイルに事前接続されます。
これらのファイルのその他の特性は、以下のものを除いて、 OPEN 指定子のデフォルト指定子値となります。
+--------------------------------IBM 拡張の終り-------------------------------+
+----------------------------------IBM 拡張----------------------------------+
順次の PRINT、READ、WRITE、 REWIND または ENDFILE ステートメントを、外部ファイルに現在接続されていない装置について実行すると、事前に設定された名前を持つファイルがその装置に暗黙接続されます (デフォルトでは、装置 n が fort.n という名前のファイルに接続されます)。装置 0 だけは暗黙的に接続することはできません。これらのファイルは、必ずしも存在している必要はありません。このファイルは、OPEN ステートメントを最初に実行しないでそれらの装置を使った場合に作成されます。デフォルトの接続は、順次 I/O 用の接続です。 (異なるファイル名に暗黙接続するための方法については、「ユーザーズ・ガイド」の『実行時オプションの設定』にある UNIT_VARS 実行時オプションを参照してください。)
装置の外部ファイルへの接続が終了していた場合、事前接続された装置のみが、暗黙的に接続することができます。次の例では、事前接続されていた装置は、暗黙接続が行われる前にクローズされています。
PROGRAM TRYME WRITE ( 6, 10 ) "Hello1" ! "Hello1" written to standard output CLOSE ( 6 ) WRITE ( 6, 10 ) "Hello2" ! "Hello2" written to fort.6 10 FORMAT (A) END
暗黙的に接続された装置の特性は、OPEN ステートメントのデフォルト指定子の値となります。ただし、この場合、最初のデータ転送ステートメントによって値が決められる FORM= および ASYNCH= 指定子は除きます。最初の I/O ステートメントで、定様式直接アクセスの形式設定、リスト指示の形式設定、または名前リストの形式設定を使用する場合、 FORM= 指定子の値は、FORMATTED に設定されます。最初の I/O ステートメントが不定様式の場合は、値は UNFORMATTED に設定されます。最初の I/O ステートメントが非同期の場合、ASYNCH 指定子の値は YES に設定されます。最初の I/O ステートメントが同期の場合は、値は NO に設定されます。
+--------------------------------IBM 拡張の終り-------------------------------+
CLOSE ステートメントは、装置からファイルを切り離します。 切り離したファイルは、同一のプログラム内で、同じ装置に再接続することも、別の装置に再接続することもできます。
+----------------------------------IBM 拡張----------------------------------+
装置 0 はクローズできません。装置 5 および 6 は、クローズされた後に、それぞれ、標準入力および標準出力に再接続することはできません。
+--------------------------------IBM 拡張の終り-------------------------------+
READ ステートメントは、外部ファイルまたは内部ファイルのいずれかからデータを取得し、内部記憶装置に格納します。 値は、ファイルから、入力リストに指定されたデータ項目 (指定されていれば) に転送されます。
WRITE ステートメントは、内部記憶装置から取得したデータを、外部ファイルまたは内部ファイルに入れます。 PRINT ステートメントは、内部記憶装置から取得したデータを、外部ファイルに入れます。 値は、出力リストおよび形式仕様によって指定されたデータ項目 (指定されていれば) から、ファイルに転送されます。 存在していないファイルに対して WRITE または PRINT ステートメントを実行すると、エラーが発生していなければ、ファイルが作成されます。
PRINT ステートメント内で出力リストを省略した場合、参照先の FORMAT ステートメントの最初の仕様に文字ストリング編集記述子またはスラッシュ編集記述子が含まれていない限り、ブランク・レコードが出力デバイス宛てに転送されます。 この場合、このような仕様によって示されたレコードは、出力デバイスに転送されます。
次に処理すべき項目を決める際には、サイズがゼロの配列および繰り返し回数がゼロの暗黙 DO リストは、無視されます。長さがゼロのスカラー文字項目は無視されません。
I/O 項目がポインターの場合、データはファイルと関連したターゲットの間で転送されます。
PAD= 指定子が NO の値を持つファイルからのアドバンス入力時に、入力リストおよび形式仕様で、レコード内にある文字を使用することはできません。 PAD= 指定子が YES の値をもっているか、入力ファイルが内部ファイルの場合に、入力リストおよび形式仕様でレコードにある文字を超える文字を必要とすると、ブランク文字が入れられます。
+----------------------------------IBM 拡張----------------------------------+
順次アクセス用に接続された外部ファイルに対してのみ埋め込みを行いたい場合は、-qxlf77 コンパイラー・オプションの noblankpad サブオプションを指定します。このサブオプションは、PAD= 指定子にはデフォルト値を、直接ファイルおよびストリーム・ファイルには NO を、順次アクセス・ファイルには YES を指定します。
+--------------------------------IBM 拡張の終り-------------------------------+
PAD= 指定子が NO の値を持つファイルからの非アドバンス入力時、入力リストおよび形式仕様でレコード内にある文字を超える文字を必要とする場合、レコード終了状態が発生します。 PAD= 指定子が YES の値を持つ場合に、入力項目および対応するデータ編集記述子がレコード内にある文字を超える文字を必要とすると、レコード終了状態が発生し、ブランク文字が入れられます。レコードが、ストリーム・ファイルの最後のレコードの場合には、ファイルの終わり条件が発生します。
+----------------------------------IBM 拡張----------------------------------+
同期 I/O の場合、その I/O 操作が完了するまで、アプリケーションの実行は停止します。非同期 I/O の場合、アプリケーションは、バックグラウンドの I/O 操作の実行中も処理を続行することができます。
FORTRAN の非同期の READ および WRITE データ転送ステートメントを使って、非同期データ転送を開始することができます。実際のデータ転送が完了したかどうかに関係なく、非同期 I/O ステートメントの後の実行が続行します。最終的に、データ転送ステートメントの実行の後に、データ転送ステートメント内の ID= 変数に戻されたものと同じ ID= 値を指定した対応する WAIT ステートメントの実行が続かなければなりません。対応する WAIT ステートメントの定義については、WAITを参照してください。
非同期 I/O ステートメントに指定された I/O 項目の実際のデータ転送は、次に示す時に完了します。
ただし、非同期データ転送ステートメントの実行時に実際のデータ転送は完了していなければならない場合があります。このような場合の詳細については、「ユーザーズ・ガイド」の『XL Fortran I/O のインプリメンテーションの詳細』を参照してください。
データ転送ステートメントの実行時にエラーが発生した場合、対応する WAIT ステートメントは要求されません。ID= 値は定義されないからです。この場合、対応する WAIT ステートメントの代わりにデータ転送ステートメントが実行されたものとして、エラー処理と状況報告 (ERR= および IOSTAT=) が行われます。
非同期データ転送ステートメント内に I/O リスト項目として現れる変数や、そのような変数と関連した変数はすべて、対応する WAIT ステートメントが実行されるまで、参照したり、定義したり、未定義にしたりしてはなりません。
非同期データ転送ステートメントと、対応する WAIT ステートメントとの間での、割り当て可能オブジェクトとポインターの割り振り解除およびポインターの関連付け状況の変更も許可されません。
同一の装置で複数の未解決の非同期データ転送操作があってもかまいませんが、すべて READ、またはすべて WRITE でなければなりません。同一の装置でのすべての非同期データ転送操作において、対応する WAIT ステートメントが実行されるまで、同一の装置での他の I/O 操作はできません。直接アクセスの場合、非同期 WRITE ステートメントで、対応する WAIT ステートメントが実行されていない非同期 WRITE ステートメントと同じ装置とレコード番号を指定してはなりません。ストリーム・アクセスの場合、非同期 WRITE ステートメントで、対応する WAIT ステートメントが実行されていない非同期 WRITE ステートメントと同じ装置または同じ位置を指定してはなりません。
非同期データ転送ステートメントと、対応する WAIT ステートメントとの間で非同期データ転送ステートメントを実行するプログラムの一部では、NUM= 指定子の integer_variable またはそれに関連するすべての変数を、参照したり、定義したり、未定義にしたりしてはなりません。
例:
! A program demonstrating the use of asynchronous I/O statements. SUBROUTINE COMPARE(ISTART, IEND, ISIZE, A) INTEGER, DIMENSION(ISIZE) :: A INTEGER I, ISTART, IEND, ISIZE DO I = ISTART, IEND IF (A (I) /= I) THEN PRINT *, "Expected ", I, ", got ", A(I) END IF END DO END SUBROUTINE COMPARE PROGRAM SAMPLE INTEGER, PARAMETER :: ISIZE = 1000000 INTEGER, PARAMETER :: SECT1 = (ISIZE/2) - 1, SECT2 = ISIZE - 1 INTEGER, DIMENSION(ISIZE), STATIC :: A INTEGER IDVAR OPEN(10, STATUS="OLD", ACCESS="DIRECT", ASYNCH="YES", RECL=(ISIZE/2)*4) A = 0 ! Reads in the first part of the array. READ(10, REC=1) A(1:SECT1) ! Starts asynchronous read of the second part of the array. READ(10,ID=IDVAR, REC=2) A(SECT1+1:SECT2) ! While the second asynchronous read is being performed, ! do some processing here. CALL COMPARE(1, SECT1, ISIZE, A) WAIT(ID=IDVAR) CALL COMPARE(SECT1+1, SECT2, ISIZE, A) END
関連情報:
+--------------------------------IBM 拡張の終り-------------------------------+
アドバンス I/O は、エラー状態が検出されなければ、最後に読み取りまたは書き込みが行われたレコードの後にレコード・ファイルを位置付けます。
非アドバンス I/O は、現行レコード内の文字位置にファイルを位置付けることができます。非アドバンス I/O により、一連の I/O ステートメントでそれぞれレコードの一部にアクセスすることによって、ファイルの読み取りおよび書き込みを行うことができます。また、可変長レコードを読み取り、そのレコードの長さを照会することもできます。
! Reads digits using nonadvancing input INTEGER COUNT CHARACTER(1) DIGIT OPEN (7) DO READ (7,FMT="(A1)",ADVANCE="NO",EOR=100) DIGIT COUNT = COUNT + 1 IF ((ICHAR(DIGIT).LT.ICHAR('0')).OR.(ICHAR(DIGIT).GT.ICHAR('9'))) THEN PRINT *,"Invalid character ", DIGIT, " at record position ",COUNT STOP END IF END DO 100 PRINT *,"Number of digits in record = ", COUNT END
POSITION= 指定子を指定する順次またはストリーム I/O 用の明示接続 (OPEN ステートメントによる) の場合、ファイルは、先頭、最後、または空いている位置に明示的に位置付けられます。
OPEN ステートメントで POSITION= 指定子が指定されていない場合は、次のようになります。
+----------------------------------IBM 拡張----------------------------------+
暗黙の OPEN の後、ファイルは先頭に位置付けられ、したがって次のようになります。
+--------------------------------IBM 拡張の終り-------------------------------+
REWIND ステートメントを使用すれば、ファイルを先頭に位置付けることができます。 事前接続されている装置 0、5、および 6 は、プログラムの親プロセスから渡されるときに、位置付けられます。
データ転送が行われる前のファイルの位置は、アクセス方式の違いによって次のように異なります。
アドバンス I/O データ転送が行われた後のファイル位置は、次のとおりです。
非アドバンス入力の場合、エラー条件またはファイルの終わり条件が発生せずに、レコードの終わり条件が発生した場合、ファイルは読み取られたレコードの直後に位置付けられます。非アドバンス入力ステートメントで、エラー条件、ファイルの終わり条件、レコードの終わり条件のいずれも発生しなかった場合、ファイルの位置は変更されません。非アドバンス入力ステートメントで、エラー条件が発生した場合、ファイルの位置は変更されません。これ以外の場合はすべて、ファイルは読み取りまたは書き込みが行われたレコードの直後に位置付けられ、そのレコードが先行レコードになります。
ファイル終了レコードを超えた位置にファイルがある場合、 READ、WRITE、PRINT、または ENDFILE ステートメントを実行することはできません (ただし、-qxlf77=softeof が設定されていない場合)。 BACKSPACE または REWIND ステートメントを使用すれば、ファイルの位置を変えることができます。
+----------------------------------IBM 拡張----------------------------------+
ファイルの終わりを超えて読み取りおよび書き込みができるようにするには、-qxlf77=softeof オプションを使用してください。詳細については、「ユーザーズ・ガイド」の -qxlf77 を参照してください。
+--------------------------------IBM 拡張の終り-------------------------------+
エラーのない定様式ストリーム出力については、ステートメントによってデータが転送された先の最も大きな値の位置にファイルの終端点が設定されます。エラーのない不定様式ストリーム出力については、ファイル位置は変更されません。ファイル位置が以前のファイル終端点を超えると、終端点はファイル位置に設定されます。書き込みデータのないファイルの終端点を拡張するには、POS= 指定子で空の出力リストを指定してください。データ転送後にエラーが発生した場合は、ファイル位置が不確定になります。