Windows用コンパイラ MAC用コンパイラ Linux/Unix用コンパイラ
 
ナビゲーション:前へ   上へ   次へ

10.7 入出力機能

10.7.1 ストリーム入出力 [5.1]

ストリームファイルはACCESS='STREAM'指定子を指定してオープンされた ファイルです。 ストリームファイルには書式付きストリームと書式なしストリームの2種類が あります。

書式付きストリームファイルはCのテキストストリームと同等です。通常の順アク セスファイルとほぼ同じように振舞いますが、レコード長に制限がないという点 が異なります。 Cにおけると同様、書式付きストリームに書き出す場合には、データに埋め込まれ た改行文字により新たなレコードが生成されることになります。 新たな組込み調査関数NEW_LINE(A)Aの種別(文字セット)とし てのこの文字を応答として返します。文字セットがASCIIの場合の値は IACHAR(10)です。
例:

  OPEN(17,FORM='formatted',ACCESS='stream',STATUS='new')
  WRITE(17,'(A)'), 'This is record 1.'//NEW_LINE('A')//'This is record 2.'

書式なしストリームファイルはCのバイナリストリームと同等で、レコード境界を 持ちません。 そのためBACKSPACEを書式なしストリームで使うことはできません。 書式なしストリームに書かれるデータは書式整形を伴わずにファイルに転送され、 書式なしストリームから読み込まれるデータはファイル上の形のまま変数に直接 転送されます。

ストリームファイルを読んだり書いたりする場合、ファイルのどこにデータを書く かを指定するためにPOS=指定子を使用することができます。 ファイルの最初の文字は位置1です。 POS=指定子はINQUIRE文の中でも利用可能で、その場合にはファイル 上における現在の位置が応答として返されます。 書式付きストリームを読んだり書いたりする場合には、READもしくは WRITEにおけるPOS=は1(つまりファイルの最初)、または以前の INQUIREにより得られた値になっています。

書式なしの順アクセスファイルとは異なり、書式なしストリームファイルに対し ファイル終端より前の位置に書き込む場合にはファイルの切詰めは行われない 点に注意して下さい。(しかし書式付きストリームの場合にはこの切詰めが行わ れます。)

最後にSTREAM=指定子がINQUIRE文に追加されています。 この指定子はスカラのデフォルト文字変数を取り、ファイルがストリーム入出力 用にオープンできる場合(ACCESS='STREAM')にはそれに対し値'YES' を、ファイルがストリーム入出力用にオープンできない場合には値'NO'を、 ファイルがストリーム入出力用にオープンできるかどうか判別できない場合には 値'UNKNOWN'を代入します。

10.7.2 BLANK= とPAD= 指定子 [5.1]

BLANK=PAD=指定子は従来OPEN文(及びINQUIRE)での み許されていましたが、この度READ文でも使えるようになりました。 これらはBLANK=もしくはPAD=のモードをREAD文の間だけ変更 します。

10.7.3 小数点 [5.1]

小数点としてカンマを持つ数値を読んだり書いたりすることができます。 このサポートはDECIMAL=指定子とDC, DP編集記述子により 提供されます。 DECIMAL=指定子はOPEN, READ, WRITE, INQUIRE 文中で指定できます。取り得る値は'POINT'(デフォルト)もしくは 'COMMA'です。接続されていない装置、または書式なし装置に対して、 INQUIRE'UNDEFINED'を応答として返します。 DC編集記述子は一時的にモードをDECIMAL='COMMA'に、DP 編集記述子は一時的にモードをDECIMAL='POINT'に設定します。

モードがDECIMAL='COMMA'の場合、すべての浮動小数点出力において 小数点がカンマになります。また浮動小数点入力においては小数点としてカンマ が期待されます。
例:

  PRINT '(1X,"Value cest ",DC,F0.2)',1.25
は次を出力します:
 Value cest 1,25

更にこのモードではカンマを並び入力での区切りとして使用できません。代りに セミコロンを使用することになります。

10.7.4 DELIM= 指定子 [5.1]

DELIM=指定子は従来OPEN文(及びINQUIRE)でのみ許されて いましたが、この度WRITE文でも使えるようになりました。 それはそのWRITE文の間だけDELIM=モードを変更します。 これはWRITE文が並びもしくは名前並び出力を行う場合にのみ有効となる 点に注意してください。
例:
  WRITE(*,*,DELIM='QUOTE') "That's all folks!"
は次を出力します:
 'That''s all folks!'

10.7.5 ENCODING= 指定子 [5.1]

ENCODING=指定子はOPENINQUIRE文で許されています。 この指定子の標準的な値は'UTF-8'とデフォルト値である'DEFAULT'です。 'UTF-8'の値はUnicode文字種別(SELECTED_CHAR_KIND参照)をサポート するコンパイラでのみ許されています。 今回のリリースのNAG Fortranコンパイラは'DEFAULT''ASCII'をサポ ートします。

10.7.6 IOMSG= 指定子 [5.1]

IOMSG=指定子はすべての入出力文に追加されました。 これはスカラデフォルト文字変数を取り、エラーが発生した際には説明メッセージが 代入されます。 (この機能は文にIOSTAT=もしくはERR=指定子が含まれる場合にのみ 有効な点に注意して下さい。そうでない場合にはエラーに伴いプログラムは終了させ られてしまいます。) エラーが発生しなかった場合には変数の値は変化しません。

10.7.7 IOSTAT= 指定子 [5.1]

この指定子はどのような種別の整変数も受け付けられるようになりました(従来はデ フォルト整数に限られていました)。

10.7.8 SIGN= 指定子 [5.1]

SIGN=指定子がOPEN, WRITE, INQUIRE文に追加されました。 利用可能な値は'PLUS', 'SUPPRESS', 'PROCESSOR_DEFINED' (デフォルト)です。 NAG Fortranコンパイラにおいては、SIGN='PROCESSOR_DEFINED'SIGN='SUPPRESS'と同一の効果を持ちます。

SIGN='PLUS'SP編集記述子と、SIGN='SUPPRESS'SS編集 記述子と、SIGN='PROCESSOR_DEFINED'S編集記述子と同一の効果を持ち ます。

10.7.9 IOSTAT=の値を調べるための組込み関数 [5.1]

組込み関数IS_IOSTAT_ENDIS_IOSTAT_EORIOSTAT=の戻り値を チェックして、それがファイル終端を意味するのかもしくはレコード終端を意味するの かを調べます。 これらはIOSTAT=の戻り値をそれぞれ名前付き定数IOSTAT_ENDIOSTAT_EORに対して調べるのと同等です。 これらの定数はISO_FORTRAN_ENVモジュールにより利用可能です。

10.7.10 IEEE無限大と非数の入出力 [5.1]

IEEE無限大と非数の入出力が可能です。出力形式は次の通りです。
  • -Infinity(もしくは入りきらない場合には-Inf) - 負の無限大
  • Infinity(もしくは入りきらない場合にはInf) - 正の無限大;
    +Infinity(または+Inf) - SPまたはSIGN='PLUS' モードの場合
  • NaN - 非数(NaN)
また、出力は出力フィールド内で右寄せになります。 並び出力の場合、出力フィールドは結果を保持するための最小サイズとなります。

IEEE無限大と非数の入力ができるようになりました。これらは以下の点を除き、上で説明 した出力と同じ形式をとります。

  • 大文字と小文字の区別はありません。
  • 非数の直前に符号があっても構いません(符号は無視されます)。
  • 非数にはかっこでくくられた英数字を続けることができます(NAG Fortranコンパイラは これも無視します)。
非数を読み込んだ際のNAG Fortranの動作は常に静かな非数であり、シグナルを発するも のではありません。

10.7.11 浮動小数点ゼロの出力 [5.1]

浮動小数点ゼロの並びと名前並び出力にはE書式のかわりにF書式が用いられます。 (Fortran 90と95の標準ではE書式が使用されます。)

10.7.12 変数群書式と内部ファイル [5.1]

内部ファイルに対する変数群入出力が可能になりました。

10.7.13 名前並びで許されている変数

6.0以降で寸法引継ぎ配列を除く全ての変数が変数群で指定可能です。(5.3.1では割付け変数とポインタは指定できません) READ文もしくはWRITE文が実行される時点で変数群に出現する割付け変数は割付けられなければならず、変数群に出現するポインタは結合されていなければなりません。 また変数が多相である場合もしくは最後の成分が割付けもしくはポインタである場合には、定義された入出力で処理される場合に限り、名前並び内で許されます。 (以下参照)

10.7.14 再帰入出力 [5.2]

内部ファイルに対する入出力が、別の内部ファイルや外部ファイルへの入出力が進行中 であっても可能になりました。 これは入出力並びの関数が内部ファイルに対するREADもしくはWRITE文 を実行した時点で発生します。

外部ファイルへの入出力が行われている間に他の外部ファイル入出力を行うことは依然 許されていません。ただしネストされたデータ転送の場合を除きます (“ユーザ定義入出力”参照)。

10.7.15 非同期入出力

10.7.15.1 基本構文 [5.1]

非同期入出力構文が許され、以下から構成されます。 OPEN, READ, WRITE, INQUIREに対する ASYNCHRONOUS=指定子、READ, WRITE, INQUIREに対する ID=指定子、及びINQUIREに対するPENDING=指定子。

INQUIRE文を除き、ASYNCHRONOUS=指定子はスカラデフォルト文字式を 受け付けます。これは'YES'もしくは'NO'(小文字も大文字として扱わ れます)と評価されなくてはなりません。 READ文とWRITE文においては、この文字式は定数式である必要があり、 文は非同期入出力接続が許されている外部ファイルを参照しなければなりません。 ASYNCHRONOUS='YES'が指定された場合に非同期のデータ転送が許されます。 OPEN文ではこの指定子がそのファイルに対する非同期データ転送を許すか どうかを規定します。デフォルト設定は'NO'です。 INQUIRE文においては、ASYNCHRONOUS=指定子はスカラデフォルト 文字変数を受け付け、ファイルが現在非同期入出力用に接続されている場合には 'YES'を、非同期入出力が許されていない場合には'NO'を、そして ファイルが接続されていない場合には'UNKNOWN'をそれに設定します。

READ文とWRITE文においてID=指定子はスカラ整変数を受け付 けます。 この指定子はASYNCHRONOUS='YES'も指定されている場合にのみ許されます。 この整変数にはREADもしくはWRITEが開始する非同期データ転送の “識別子”が代入されます。この値はINQUIRE文とWAIT文で非 同期データ転送の進行を追跡するために利用できます。

INQUIRE文においては、ID=指定子はスカラ整数式を受け付けますが、 その値は該当ファイルに対するREAD文もしくはWRITE文で ID=から返されるものでなくてはなりません。またそれはPENDING= 指定子と併用した場合にのみ許されます。 PENDING=指定子はスカラデフォルト論理変数を受け付け、指定された非同期 データ転送がまだ進行中であればそれを.TRUE.に、完了していれば .FALSE.に設定します。 PENDING=ID=なしで使用された場合、その問合せは該当ファイルに 対するすべての仕掛り中非同期データ転送が対象となります。

非同期データ転送の開始後は、転送の終了が確認されるまで関係する変数の参照もし くは定義を行ってはなりません。 局所変数の非同期WRITEの場合、転送が完了するまで手続きからの復帰が行わ れないことを意味します。 非同期データ転送の終了は該当ファイルに対し、後続の同期データ転送があった場合、 INQUIRE文がありPENDING=.FALSE.の応答があった場合、 またはWAIT文が実行された場合に確認できます。

10.7.15.2 基本的な例

以下は2つのバッファbuf1buf2を使用した例で、ファイル中 にデータがある間は一方を読込み用に、もう一方を処理用に交互に使用します (それぞれのデータセットには後続データの有無を示す論理値が続いているも のとします)。
  REAL :: buf1(n,m),buf2(n,m)
  LOGICAL more,stillwaiting
  READ (unit) buf1
  DO
    READ (unit) more ! Note: synchronous
    IF (more) READ (unit,ASYNCHRONOUS='YES') buf2
    CALL process(buf1)
    IF (.NOT.more) EXIT
    READ (unit) more ! Note: synchronous
    IF (more) READ (unit,ASYNCHRONOUS='YES') buf1
    CALL process(buf2)
    IF (.NOT.more) EXIT
  END DO

同期READ文は論理値を読み込む前に、仕掛り中の非同期 データ転送の完了 を自動的に待つ(“wait”)ことになる点に注意してください。これにより データセットのバッファ中への読込みは完了しており、処理が安全に行えることが 保証されます。

10.7.15.3 ASYNCHRONOUS属性 [5.2]

ASYNCHRONOUS='YES'を指定したREAD文もしくはWRITE文は、 その入出力リスト、SIZE=指定子の中、もしくはNML=で示される名前 並びに現れるどのような変数にも自動的にASYNCHRONOUS属性を付加します。 これは単一の手続き内で起動され終了する非同期データ転送の場合には適しています。 しかしながら、モジュール変数や仮引数に対する転送で、手続きからの復帰が転送中 に行われる場合には不適切と言えます。

ASYNCHRONOUS属性は型宣言文もしくはASYNCHRONOUS文で明示的に指定 できます。 ASYNCHRONOUS文での構文は次の通りです。

ASYNCHRONOUS [::] variable-name [ , variable-name ]...

ASYNCHRONOUS属性を持つ変数が仮配列で形状引継ぎ配列もしくは配列ポインタ でない場合、結合された実引数は部分配列、形状引継ぎ配列もしくは配列ポインタで あってはなりません。 また仮引数がASYNCHRONOUS属性を持つ場合には、その手続きは明示的な引用仕 様を持っている必要があります。 これらの制限は双方とも、属性が明示的に与えられた場合にも暗黙的に与えられた場合 にも当てはまります。

10.7.15.4 WAIT文 [5.2]

WAIT文はその他の入出力を行うことなく非同期データ転送の完了を待つ機能を 提供します。 その構文は次の通りです。

WAIT ( wait-spec [ , wait-spec ]... )

ここで wait-spec は以下のいずれかです:

UNIT = file-unit-number
END = label
EOR = label
ERR = label
ID = scalar-integer-variable
IOMSG = scalar-default-character-variable
IOSTAT = scalar-integer-variable

UNIT=指定子は指定されなければなりませんが、‘UNIT =’は それが並びでの最初の指定子であれば省略可能です。 ID=指定子はスカラ整数式を受け付けますが、その値は該当ファイルに対する READ文もしくはWRITE文のID=から返されるものでなくてはなり ません。ID=指定子が指定されなかった場合、WAIT文は該当ファイルに 対するすべての待ち状態の非同期データ転送が対象となります。

WAIT文の実行完了時には指定された非同期データ転送は完了しています。 指定されたファイルが非同期入出力用にオープンされていなかったり、接続されていな かった場合には、WAIT文は何の効果も持ちません(ID=指定子が不正な 値に対して使われた場合を除いてエラーとはなりません)。

WAIT文の使用例を示します。

  REAL array(1000,1000,10),xferid(10)
  ! Start reading each segment of the array
  DO i=1,10
    READ (unit,id=xfer(i)) array(:,:,i)
  END DO
  ...
  ! Now process each segment of the array
  DO i=1,10
    WAIT (unit,id=xfer(i))
    CALL process(array(:,:,i)
  END DO

10.7.15.5 実行のセマンティクス

この時点では、Fortran標準で許されているとおり、すべての実際の入出力は同期式に 留まっています。

10.7.16 反復数が後に続くけた移動数 [5.1]

けた移動数(nP)と反復数(例:3E12.2の中の‘3’) の間に従来必要であったカンマが省略可能となりました。 この簡単な拡張はFortran 66からのもので一旦Fortran 77で削除され、再度 Fortran 2003で復活しました。

10.7.17 FLUSH文 [5.2]

FLUSH文の実行により、指定されたファイルに書かれたデータが他のプロセス でも利用できるようになります。 もしくは他のプロセスによりそのファイル中に置かれたデータが現在のプログラムで 利用できるようになります。 FLUSH文の構文はBACKSPACE, ENDFILE, REWIND文と似た もので、次のいずれかの形を取ります。

FLUSH file-unit-number
FLUSH ( flush-spec [ , flush-spec ]... )

ここでfile-unit-number は論理装置番号(スカラ整数式)を、flush-spec は次のいずれかを表します:

UNIT = file-unit-number
IOSTAT = scalar-integer-variable
IOMSG = scalar-default-character-variable
ERR = label

UNIT=指定子は必須ですが、‘UNIT =’は並び中における最初の flush-spec であれば省略できます。

FLUSH文の使用例を示します。

   WRITE (pipe) my_data
   FLUSH (pipe)

10.7.18 ユーザ定義入出力 [n/a]

総称識別子READ(FORMATTED), READ(UNFORMATTED), WRITE(FORMATTED), WRITE(UNFORMATTED)は構造型項目に対する 通常の入出力処理を置き換える機能を提供します。 書式付き入出力の場合、この置換えは並び書式、名前並び書式、及びDT 編集記述子を持つ明示的書式に対して行われます。 それは明示的書式における他の編集記述子には影響を与えません。 ユーザ定義入出力を用いるとユーザ定義手続きが処理を行うため、ポインタ成分 や割付け成分を持つ構造型への入出力か可能となります。

ユーザ定義入出力手続きを持つ型定義の例を示します。

  TYPE tree
    TYPE(tree_node),POINTER :: first
  CONTAINS
    PROCEDURE :: fmtread=>tree_fmtread
    PROCEDURE :: fmtwrite=>tree_fmtwrite
    GENERIC,PUBLIC :: READ(formatted)=>fmtread, WRITE(formatted)=>fmtwrite
  END TYPE

上の型定義が与えられた場合、TYPE(tree)オブジェクトが書式付き入出力 並びで有効な項目であるときは常に、(READ文中で)モジュール手続き tree_fmtreadがコールされ、もしくは(WRITE文中で) モジュール手続きtree_fmtwriteがコールされ、該当オブジェクトに対する 入出力が行われます。 総称引用仕様ブロックでもユーザ定義入出力の手続き宣言が行える点に注意してく ださい。連続型もしくはBIND(C)型においてはこの方法しかありません が、拡張可能型に対しては推奨されません。

それぞれの入出力総称識別子と結合された手続きは、下記と同じ特性を持っていなく てはなりません。ここにtype-declaration は拡張可能型の場合 CLASS(derived-type-spec)であり、連続型もしくは BIND(C)型の場合にはTYPE(derived-type-spec)です。 構造型が長さ型パラメタを持つ場合、それらは(‘*’として指定され る)“引継ぎ”でなければならない点に注意してください。

SUBROUTINE formatted_read(var,unit,iotype,vlist,iostat,iomsg)
type-declaration,INTENT(INOUT) :: var
INTEGER,INTENT(IN) :: unit
CHARACTER(*),INTENT(IN) :: iotype
INTEGER,INTENT(IN) :: vlist(:)
INTEGER,INTENT(OUT) :: iostat
CHARACTER(*),INTENT(INOUT) :: iomsg

SUBROUTINE unformatted_read(var,unit,iostat,iomsg)
type-declaration,INTENT(INOUT) :: var
INTEGER,INTENT(IN) :: unit
INTEGER,INTENT(OUT) :: iostat
CHARACTER(*),INTENT(INOUT) :: iomsg

SUBROUTINE formatted_write(var,unit,iotype,vlist,iostat,iomsg)
type-declaration,INTENT(IN) :: var
INTEGER,INTENT(IN) :: unit
CHARACTER(*),INTENT(IN) :: iotype
INTEGER,INTENT(IN) :: vlist(:)
INTEGER,INTENT(OUT) :: iostat
CHARACTER(*),INTENT(INOUT) :: iomsg

SUBROUTINE unformatted_write(var,unit,iostat,iomsg)
type-declaration,INTENT(IN) :: var
INTEGER,INTENT(IN) :: unit
INTEGER,INTENT(OUT) :: iostat
CHARACTER(*),INTENT(INOUT) :: iomsg

それぞれの手続き内で、unitは親入出力文が通常装置番号を使用している ときは通常装置番号を、親入出力文が内部ファイルに対するものであるときは負の 数を、‘*’装置のときはプロセッサ依存の番号(負の値もあり得ま す)を意味します。 iostat引数にはユーザ定義入出力手続きからの復帰前に値が代入されてい なくてはなりません。その場合、ゼロは成功を、負の値IOSTAT_EOR(組込み モジュールISO_FORTRAN_ENVで定義)はレコード終端条件を、負の値 IOSTAT_ENDはファイルの終端条件を、正の値はエラー条件をそれぞれ表しま す。 iomsg引数はエラーが発生していない時にはそのままにしておく必要があり、 iostatがゼロ以外の値を取るときには説明メッセージを代入する必要があり ます。

書式付き入出力手続きにおいてiotype引数は、並び書式の場合に ‘LISTDIRECTED’に、名前並び書式の場合に‘NAMELIST’ に、DT編集記述子が処理されている場合に‘DT’が文字表現 (character-literal)と連結された値にセットされます。 vlist引数はDT編集記述子中の値の並びを持ち、それが存在しない場合 にはゼロサイズの配列となります。 DT編集記述子の構文は次の通りである点に注意してください:

DT [ character-literal ] [ ( value [ , value ]... ) ]

ここで空白は特に意味を持たず、character-literal は種別パラメタを持たない デフォルト文字定数表現で、それぞれのvalue は種別パラメタを持たない省略可 能で符号付きの整数定数表現です。 例えば‘DT’, ‘DT"z8,i4,e10.2"’, ‘DT(100,-3,+4,666)’, ‘DT"silly example"(0)’はすべて構文的に正しいDT編集記述子です。 それらが何を意味するかの解釈はユーザ定義手続き次第です。

ユーザ定義入出力手続きを実行している間、unit引数以外の外部装置への 入出力は行えませんが、内部ファイルへの入出力は許容されます。 ファイル位置付けコマンドは使用できません。 書式なし入出力の場合、手続き内で多数のデータ転送文が別個に実行されたとしても、 すべての入出力は現在のレコード内で行われます。すなわちネストされたデータ転送 の前後でのファイル位置付けは抑止されます。 書式付き入出力の場合、その効果はネストされたデータ転送文が停留型とみなされる のとほぼ同等です。 (スラッシュ(/)編集記述子、もしくはストリームファイルへの改行文字の 送信を用いた)明示的なレコード終結は有効です。またネストされた並びもしくは 名前並び入出力文を用いてレコードを終わらせることも可能です。

unitが外部ファイルと結合されている場合(すなわち非負、もしくは組込み モジュールISO_FORTRAN_ENVからの定数ERROR_UNIT, INPUT_UNIT, OUTPUT_UNITのいずれかに等しい場合)、PADモード、 符号モードなどの現在の設定をINQUIREunit引数にPAD=SIGN=等を指定して調べることができます。 なお、INQUIREunitが内部ファイルと結合している場合には使用で きない点に注意して下さい。

最後に、ユーザ定義入出力は非同期入出力との互換性はありません。ユーザ定義入出 力に関連するすべての入出力文は同期型でなくてはなりません。


Privacy Policy | Trademarks