9.7 入出力機能
9.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'
を代入します。
9.7.2 BLANK= とPAD= 指定子 [5.1]
BLANK=
とPAD=
指定子は従来OPEN
文(及びINQUIRE
)での
み許されていましたが、この度READ
文でも使えるようになりました。
これらはBLANK=
もしくはPAD=
のモードをREAD
文の間だけ変更
します。
9.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
更にこのモードではカンマを並び入力での区切りとして使用できません。代りに セミコロンを使用することになります。
9.7.4 DELIM= 指定子 [5.1]
DELIM=
指定子は従来OPEN
文(及びINQUIRE
)でのみ許されて
いましたが、この度WRITE
文でも使えるようになりました。
それはそのWRITE
文の間だけDELIM=
モードを変更します。
これはWRITE
文が並びもしくは名前並び出力を行う場合にのみ有効となる
点に注意してください。
例:
WRITE(*,*,DELIM='QUOTE') "That's all folks!"は次を出力します:
'That''s all folks!'
9.7.5 ENCODING= 指定子 [5.1]
ENCODING=
指定子はOPEN
とINQUIRE
文で許されています。
この指定子の標準的な値は'UTF-8'
とデフォルト値である'DEFAULT'
です。
'UTF-8'
の値はUnicode文字種別(SELECTED_CHAR_KIND
参照)をサポート
するコンパイラでのみ許されています。
今回のリリースのnAG Fortranコンパイラは'DEFAULT'
と'ASCII'
をサポ
ートします。
9.7.6 IOMSG= 指定子 [5.1]
IOMSG=
指定子はすべての入出力文に追加されました。
これはスカラデフォルト文字変数を取り、エラーが発生した際には説明メッセージが
代入されます。
(この機能は文にIOSTAT=
もしくはERR=
指定子が含まれる場合にのみ
有効な点に注意して下さい。そうでない場合にはエラーに伴いプログラムは終了させ
られてしまいます。)
エラーが発生しなかった場合には変数の値は変化しません。
9.7.7 IOSTAT= 指定子 [5.1]
この指定子はどのような種別の整変数も受け付けられるようになりました(従来はデ フォルト整数に限られていました)。9.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
編集記述子と同一の効果を持ち
ます。
9.7.9 IOSTAT=の値を調べるための組込み関数 [5.1]
組込み関数IS_IOSTAT_END
とIS_IOSTAT_EOR
はIOSTAT=
の戻り値を
チェックして、それがファイル終端を意味するのかもしくはレコード終端を意味するの
かを調べます。
これらはIOSTAT=
の戻り値をそれぞれ名前付き定数IOSTAT_END
と
IOSTAT_EOR
に対して調べるのと同等です。
これらの定数はISO_FORTRAN_ENV
モジュールにより利用可能です。
9.7.10 IEEE無限大と非数の入出力 [5.1]
IEEE無限大と非数の入出力が可能です。出力形式は次の通りです。-
-Infinity
(もしくは入りきらない場合には-Inf
) - 負の無限大 -
Infinity
(もしくは入りきらない場合にはInf
) - 正の無限大;
+Infinity
(または+Inf
) -SP
またはSIGN='PLUS'
モードの場合 -
NaN
- 非数(NaN)
IEEE無限大と非数の入力ができるようになりました。これらは以下の点を除き、上で説明 した出力と同じ形式をとります。
- 大文字と小文字の区別はありません。
- 非数の直前に符号があっても構いません(符号は無視されます)。
- 非数にはかっこでくくられた英数字を続けることができます(nAG Fortranコンパイラは これも無視します)。
9.7.11 浮動小数点ゼロの出力 [5.1]
浮動小数点ゼロの並びと名前並び出力にはE書式のかわりにF書式が用いられます。 (Fortran 90と95の標準ではE書式が使用されます。)9.7.12 変数群書式と内部ファイル [5.1]
内部ファイルに対する変数群入出力が可能になりました。9.7.13 名前並びで許されている変数
6.0以降で寸法引継ぎ配列を除く全ての変数が変数群で指定可能です。(5.3.1では割付け変数とポインタは指定できません)READ
文もしくはWRITE
文が実行される時点で変数群に出現する割付け変数は割付けられなければならず、変数群に出現するポインタは結合されていなければなりません。
また変数が多相である場合もしくは最後の成分が割付けもしくはポインタである場合には、定義された入出力で処理される場合に限り、名前並び内で許されます。
(以下参照)
9.7.14 再帰入出力 [5.2]
内部ファイルに対する入出力が、別の内部ファイルや外部ファイルへの入出力が進行中 であっても可能になりました。 これは入出力並びの関数が内部ファイルに対するREAD
もしくはWRITE
文
を実行した時点で発生します。
外部ファイルへの入出力が行われている間に他の外部ファイル入出力を行うことは依然 許されていません。ただしネストされたデータ転送の場合を除きます (“ユーザ定義入出力”参照)。
9.7.15 非同期入出力
9.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
文が実行された場合に確認できます。
9.7.15.2 基本的な例
以下は2つのバッファbuf1
とbuf2
を使用した例で、ファイル中
にデータがある間は一方を読込み用に、もう一方を処理用に交互に使用します
(それぞれのデータセットには後続データの有無を示す論理値が続いているも
のとします)。
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”)ことになる点に注意してください。これにより
データセットのバッファ中への読込みは完了しており、処理が安全に行えることが
保証されます。
9.7.15.3
ASYNCHRONOUS
属性 [5.2]
ASYNCHRONOUS='YES'
を指定したREAD
文もしくはWRITE
文は、
その入出力リスト、SIZE=
指定子の中、もしくはNML=
で示される名前
並びに現れるどのような変数にも自動的にASYNCHRONOUS
属性を付加します。
これは単一の手続き内で起動され終了する非同期データ転送の場合には適しています。
しかしながら、モジュール変数や仮引数に対する転送で、手続きからの復帰が転送中
に行われる場合には不適切と言えます。
ASYNCHRONOUS
属性は型宣言文もしくはASYNCHRONOUS
文で明示的に指定
できます。
ASYNCHRONOUS
文での構文は次の通りです。
ASYNCHRONOUS
[::
] variable-name [ ,
variable-name ]...
ASYNCHRONOUS
属性を持つ変数が仮配列で形状引継ぎ配列もしくは配列ポインタ
でない場合、結合された実引数は部分配列、形状引継ぎ配列もしくは配列ポインタで
あってはなりません。
また仮引数がASYNCHRONOUS
属性を持つ場合には、その手続きは明示的な引用仕
様を持っている必要があります。
これらの制限は双方とも、属性が明示的に与えられた場合にも暗黙的に与えられた場合
にも当てはまります。
9.7.15.4
WAIT
文 [5.2]
WAIT
文はその他の入出力を行うことなく非同期データ転送の完了を待つ機能を
提供します。
その構文は次の通りです。
WAIT
( 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
9.7.15.5 実行のセマンティクス
この時点では、Fortran標準で許されているとおり、すべての実際の入出力は同期式に 留まっています。9.7.16 反復数が後に続くけた移動数 [5.1]
けた移動数(nP
)と反復数(例:3E12.2
の中の‘3
’)
の間に従来必要であったカンマが省略可能となりました。
この簡単な拡張はFortran 66からのもので一旦Fortran 77で削除され、再度
Fortran 2003で復活しました。
9.7.17 FLUSH文 [5.2]
FLUSH
文の実行により、指定されたファイルに書かれたデータが他のプロセス
でも利用できるようになります。
もしくは他のプロセスによりそのファイル中に置かれたデータが現在のプログラムで
利用できるようになります。
FLUSH
文の構文はBACKSPACE
, ENDFILE
, REWIND
文と似た
もので、次のいずれかの形を取ります。
FLUSH
file-unit-number
FLUSH (
flush-spec [ , 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)
9.7.18 ユーザ定義入出力 [6.2]
総称識別子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 ]... )
]
DT
編集記述子です。
それらが何を意味するかの解釈はユーザ定義手続き次第です。
ユーザ定義入出力手続きを実行している間、unit
引数以外の外部装置への
入出力は行えませんが、内部ファイルへの入出力は許容されます。
ファイル位置付けコマンドは使用できません。
書式なし入出力の場合、手続き内で多数のデータ転送文が別個に実行されたとしても、
すべての入出力は現在のレコード内で行われます。すなわちネストされたデータ転送
の前後でのファイル位置付けは抑止されます。
書式付き入出力の場合、その効果はネストされたデータ転送文が停留型とみなされる
のとほぼ同等です。
(スラッシュ(/
)編集記述子、もしくはストリームファイルへの改行文字の
送信を用いた)明示的なレコード終結は有効です。またネストされた並びもしくは
名前並び入出力文を用いてレコードを終わらせることも可能です。
unit
が外部ファイルと結合されている場合(すなわち非負、もしくは組込み
モジュールISO_FORTRAN_ENV
からの定数ERROR_UNIT
,
INPUT_UNIT
, OUTPUT_UNIT
のいずれかに等しい場合)、PADモード、
符号モードなどの現在の設定をINQUIRE
のunit
引数にPAD=
、
SIGN=
等を指定して調べることができます。
もしunit
が負である場合(内部ファイルと結合している場合)、
INQUIRE
はIOSTAT_INQUIRE_INTERNAL_UNIT
エラーとなります。
最後に、ユーザ定義入出力は非同期入出力との互換性はありません。ユーザ定義入出 力に関連するすべての入出力文は同期型でなくてはなりません。