データ転送ステートメント

READ ステートメントは、外部 または内部ファイルからデータを取得し、 そのデータを内部記憶装置に転送します。 入力リストを指定した場合、値はファイルから指定のデータ項目に転送されます。

WRITE ステートメントは、データを内部記憶装置から 外部または内部ファイルに転送します。

PRINT ステートメントは、データを内部記憶装置から 外部ファイルに転送します。 -qport=typestmt コンパイラー・オプションを指定すると、PRINT と 同一の機能をサポートする TYPE ステートメントを使用できるようになります。 出力リストと形式仕様を指定した場合、値は指定のデータ項目からファイルに転送されます。 出力リストを指定しない場合、PRINT ステートメントは、 参照する FORMAT ステートメントの最初の指定に 文字ストリング編集記述子またはスラッシュ編集記述子が含まれていない限り、 ブランク・レコードを出力装置に転送します。 この場合、このような指定によって示されたレコードは、出力装置に転送されます。

存在しないファイルに対して WRITE または PRINT ステートメントを実行すると、 エラーが発生しない限り、そのファイルが作成されます。

次に処理すべき項目を決める際には、サイズがゼロの配列および繰り返し回数がゼロの 暗黙 DO リストは、無視されます。 長さがゼロのスカラー文字項目は無視されません。

入出力項目がポインターの場合、データはファイルと関連ターゲットの間で転送されます。

PAD= 指定子が NO の値を持つファイルからのアドバンス入力時に、 入力リストおよび形式仕様で、レコード内にある文字数を超える文字をレコードに要求してはなりません。 PAD= 指定子が YES の値を持っているか、 入力ファイルが内部ファイルの場合に、入力リストおよび 形式仕様でレコード内にある文字数を超える文字を必要とすると、ブランク文字が入れられます。

+----------------------------------IBM 拡張----------------------------------+

順次アクセス用に接続された外部ファイルにのみ埋め込みを 行いたい場合、-qxlf77=noblankpad コンパイラー・オプションを指定します。 また、このコンパイラー・オプションは、PAD= 指定子の デフォルト値を、直接ファイルおよびストリーム・ファイルについては NO に設定し、 順次ファイルについては YES に設定します。

+------------------------------End of IBM 拡張-------------------------------+

PAD= 指定子が NO の値を持つファイルからの非アドバンス入力時に、 入力リストおよび形式仕様でレコード内にある文字数を超える文字を 必要とする場合、レコード終了状態が発生します。 PAD= 指定子が YES の値を持つ場合に、入力項目 および対応するデータ編集記述子がレコード内にある 文字を超える文字を必要とすると、レコード終了状態が発生し、 ブランク文字が入れられます。 レコードがストリーム・ファイルの最後のレコードの場合は、ファイルの終わり条件が発生します。

非同期入出力

非同期 READ および WRITE データ転送ステートメントを使用して 非同期データ転送を開始することができます。 データ転送の完了を待たずに、非同期 I/O ステートメントの後も実行が続行します。 データ転送ステートメントの ID= 変数に戻された値と 同じ ID= 値と一致する WAIT ステートメントを実行すると、 データ転送ステートメントの完了が検出されるか、 またはデータ転送ステートメントの完了が待機されます。

非同期 I/O ステートメントの I/O 項目のデータ転送は、以下のタイミングで完了します。

非同期データ転送ステートメントの実行時にデータ転送が完了しなければならない状況については、 「XL Fortran ユーザーズ・ガイド」の『XL Fortran 入出力のインプリメンテーションの詳細』を参照してください。

非同期データ転送ステートメントの実行時にエラーが発生した場合、 ステートメントは、それが同期の場合と同様に実行されます。 ID= 指定子は未定義のままになり、 それに伴う WAIT ステートメントは実行されません。 WAIT ステートメントの代わりに、ERR= 指定子がエラーを 処理し、IOSTAT= 指定子が I/O 操作の状況を示します。

対応する WAIT ステートメントの実行までは、非同期データ転送ステートメントの I/O リストにある変数に関連する変数または項目を参照したり、定義したり、 または定義解除したりしてはなりません。

非同期データ転送ステートメントと、対応する WAIT ステートメント との間での、割り当て可能オブジェクトとポインターの割り振り解除およびポインター の関連付け状況の変更は許可されません。

同一の装置に対する複数の未処理非同期データ転送操作は、 すべて READ であるか、または すべて WRITE である必要があります。 同一の装置に対するすべての未処理非同期データ転送操作について、 対応する WAIT ステートメントが実行されるまでは、 同じ装置に対して他の I/O ステートメントを指定してはなりません。 直接アクセスの場合、非同期 WRITE ステートメントで、 対応する WAIT ステートメントが実行されていない 非同期 WRITE ステートメントと同じ装置とレコード番号を 指定してはなりません。

FORTRAN 2003 の開始 ストリーム・アクセスの場合、 非同期 WRITE ステートメントで、対応する WAIT ステートメントが実行されていない非同期 WRITE ステートメントと同じ装置またはファイル内の同じ位置を指定してはなりません。

FORTRAN 2003 の終了

非同期データ転送ステートメントと、対応する WAIT ステートメント との間で非同期データ転送ステートメントを実行するプログラムの一部 では、NUM= 指定子の integer_variable または それに関連するすべての変数を、参照したり、定義したり、定義を削除したり してはなりません。

非同期データ転送ステートメントと、対応する WAIT ステートメントとの間で 実行されるプログラムの一部では、READ または WRITE ステートメントの NUM= 指定子にある integer_variable に関連する変数または項目を、参照したり、定義したり、 定義解除したりしてはなりません。

非同期 I/O の使用法

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

アドバンス入出力および非アドバンス入出力

アドバンス I/O は、エラー状態が発生しない限り、 最後に読み取りまたは書き込みが行われたレコードの後にレコード・ファイルを位置付けます。

非アドバンス I/O は、現行レコード内の文字位置、または後続のレコードにファイルを 位置付けることができます。 非アドバンス I/O を使用すると、それぞれがレコードの一部にアクセスする 一連の I/O ステートメントによって、ファイルのレコードの READ または WRITE を行うことができます。 また、可変長レコードを読み取り、そのレコードの長さを照会することもできます。

非アドバンス 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
 
! When the contents of fort.7 is '1234n', the output is:
 
!   Number of digits in record =  4
 
 

データ転送が行われる前後のファイルの位置

POSITION= 指定子を 指定する順次またはストリーム I/O 用の 明示接続 (OPEN ステートメントを使用する) の場合、 ファイルを、先頭、最後、または空いている位置に明示的に位置付けることができます。

OPEN ステートメントで POSITION= 指定子が 指定されていない場合は、次のようになります。

+----------------------------------IBM 拡張----------------------------------+

暗黙の OPEN の後、ファイル位置は以下のように先頭になります。

+------------------------------End of IBM 拡張-------------------------------+

REWIND ステートメントを使用してファイルを先頭に位置付けることができます。 事前接続されている装置 0、5、および 6 は、 アプリケーションの親プロセスから渡されるときに位置付けられます。

データ転送が行われる前のファイルの位置は、アクセス方式の違い によって次のように異なります。

アドバンス I/O データ転送の後のファイル位置は、次のとおりです。

非アドバンス入力の後のファイル位置は、次のとおりです。

ファイル終了レコードを超えた位置にファイルが ある場合、READWRITEPRINT、 または ENDFILE ステートメントは、 コンパイラー・オプション -qxlf77=softeof が設定されていない場合には 実行できません。 BACKSPACE または REWIND ステートメントを使用 すれば、ファイルを位置変更することができます。

+----------------------------------IBM 拡張----------------------------------+

ファイルの終わりを超えて読み取りおよび書き込みができるように するには、-qxlf77=softeof オプションを使用してください。

+------------------------------End of IBM 拡張-------------------------------+

エラーのない定様式ストリーム出力については、 ステートメントによってデータが転送された先の最も大きな値の位置に ファイルの終端点が設定されます。 エラーのない不定様式ストリーム出力については、ファイル位置は変更されません。 ファイル位置が前のファイル終端点を超えると、終端点はファイル位置に設定されます。 書き込みデータのないファイルの終端点を拡張するには、POS= 指定子で 空の出力リストを指定してください。 データ転送後にエラーが発生した場合、ファイル位置は不確定になります。 IBM Copyright 2003