形式指示の形式設定

形式指示の形式設定を使用すると、形式仕様で 編集記述子を使用して編集を制御できます。 形式仕様は、FORMAT ステートメントを使用して指定するか、あるいはデータ転送ステートメント内の 文字配列または文字式の値として指定します。 編集記述子を使用すると、編集を 2 つの方法で制御できます。 データ編集記述子によってデータ型ごとの編集を指定できます。 制御編集記述子は、編集プロセスにフォーカスを置きます。

複素数編集

複合値を編集するには、対の編集記述子を使用することに よって複素数編集を指定する必要があります。複素数は、1 対の別個の実数コンポーネントからなる値です。 複素数編集を指定すると、最初の編集記述子は数値の実数部に適用されます。 2 番目の編集記述子は数値の虚数部に適用されます。

複素数編集の対に対して異なる編集記述子を指定し、その対の編集記述子間で 1 つ以上の制御編集記述子を 使用できます。 その対の編集記述子間でデータ編集記述子を指定してはなりません。

データ編集記述子

文字および数値データを編集するには、データ編集記述子 を指定することができます。データ編集記述子テーブルは、すべての文字、文字ストリングおよび数値エディット記述子の完全なリストを含みます。数値データは、整数、実数および複合値を参照します。

表 17. データ編集記述子

形式 使途
A
Aw
文字値を編集します。
Bw
Bw.m
2 進値を編集します。
Ew.d
Ew.dEe
Ew.dDe *
Ew.dQe *
Dw.d
ENw.d
ENw.dEe
ESw.d
ESw.dEe
Qw.d *
指数付き実数および複素数を編集します。
Fw.d 指数なしの実数および複素数を編集します。
Gw.d
Gw.dEe
Gw.dDe *
Gw.dQe *
データの型に出力形式を適用し、組み込み型のデータ・フィールドを編集します。 また、データの型が実数の場合、データの絶対値を編集します。
nHstr 文字ストリング (str) を出力します。
Iw
Iw.m
整数を編集します。
Lw 論理値を編集します。
Ow
Ow.m
8 進値を編集します。
Q * 入力レコード内に残っている文字のカウントを戻します。*
Zw
Zw.m
16 進値を編集します。
'str'
"str"
文字ストリング (str) を出力します。

それぞれの意味は次のとおりです。

*
IBM 拡張を指定します。

d
小数点以下の桁数を指定します。

e
指数フィールド内の桁数を指定します。

m
印刷する桁数を指定します。

n
リテラル・フィールド内の文字数を指定します。 ブランクは文字のカウントに含まれます。

w
肯定値としてすべてのブランクを含む、フィールドの幅を指定します。

FORTRAN 95 の開始 BFIO、または、Z を指定する場合、出力の編集記述子および、w の値はゼロです。 FORTRAN 95 の終了

データ編集記述子および修飾子に関する規則

kind 型付きパラメーターを指定してはなりません。

編集記述子修飾子は、符号なし整数のリテラル定数でなければなりません。

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

wmd、および e 修飾子の場合、不等号括弧 (< および >) でスカラー整数式を囲む必要があります。詳細については、変数形式設定式を参照してください。

注:

Q データ編集記述子には 2 つのタイプがあります。

拡張精度 Q
Q 編集記述子で、Qw.d という構文からなります。

文字カウント Q
Q 編集記述子で、Q という構文からなります。

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

出力での数値データ編集記述子に関する規則

先行ブランクは無視されます。 その他のブランクの解釈は、OPEN ステートメントの 中の BLANK= 指定子、BN、および BZ の 2 つの編集記述子によって 制御できます。 すべてのブランクのフィールドは、ゼロと見なされます。

プラス記号の指定はオプションですが、BO、および Z 編集記述子に対して指定することはできません。

FEENESDG、および拡張精度 Q 編集では、入力フィールド内にある小数点は、小数点位置を指定する編集記述子の部分をオーバーライドします。フィールドでは、内部的に表現できる桁数を超える桁を持つことができます。

出力での数値データ編集記述子に関する規則

文字は、フィールド内では右寄せに入れられます。

フィールドの文字数がフィールド幅より少ない場合、残りのフィールド・スペースが先行ブランクで埋められます。

フィールドの文字数がフィールド幅を超える場合、または指数が指定した幅を超える場合、アスタリスクで、フィールド全体のスペースが埋められます。

負符号は、負の値の接頭部です。正の値、またはゼロは、SSP、もしくは SS 編集記述子を指定しない場合、出力で正符号の接頭部を受け取りません。

+---------------------------------Fortran 95---------------------------------+

-qxlf90 コンパイラー・オプションを指定すると、EDQ (拡張精度)FENES および G (一般編集) 編集記述子は、signedzero サブオプションの指定によって異なった負の値を出力します。

EN およびES 編集記述子は、値が signedzero および nosignedzero サブオプションに対して負の場合、負符号を出力します。

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

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

XL Fortran では、NaN (番号ではない) が、『NAN』、『+NAN』、または『-NAN』によって示されます。XL Fortran では、無限大は 『INF』、『+INF』、または『-INF』によって示されます。

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

制御編集記述子


表 18. 制御編集 記述子

形式 使途
/
r /
現在のレコードに関するデータ転送の終わりを指定します。
: 入出力リスト内にこれ以上項目がない場合に、形式制御の終わりを指定します。
$ * 出力でレコードの終わりを抑制します。*
BN 数値入力フィールド内の非先行ブランクを無視します。
BZ 数値入力フィールド内の非先行ブランクをゼロとして解釈します。
kP 実数および複素数項目に対してスケール因数を指定します。
S SS
正符号を書き込まないように指定します。
SP 正符号を書き込むように指定します。
Tc 次の文字の転送先または転送元のレコード内での絶対位置を指定します。
TLc 次の文字の転送先または転送元のレコード内での相対位置 (レコード内の 現在の位置の左側の位置) を指定します。
TRc
oX
次の文字の転送先または転送元のレコード内での相対位置 (レコード内の 現在の位置の右側の位置) を指定します。

それぞれの意味は次のとおりです。

*
IBM 拡張を指定します。

r
繰り返し指定子です。 これは、符号なしかつ正のリテラル整定数です。

k
使用するスケール因数を指定します。 これは、オプションの符号付きリテラル整定数です。

c
レコード内の文字位置を指定します。 これは、符号なしかつゼロ以外のリテラル整定数です。

o
レコード内の相対文字位置です。 これは、符号なしかつゼロ以外のリテラル整定数です。

制御編集記述子および修飾子に関する規則

kind 型付きパラメーターを指定してはなりません。

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

rkc、および o は、 整数値に評価される不等号括弧で 囲まれた算術式としても表すことができます。

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

I/O リストと形式仕様の相互作用

形式指示の形式設定では、まず、形式制御が開始されます。 形式制御の各アクションは、形式仕様内で次に指定されている編集記述子、 および入出力リスト内で次に指定されている項目 (ある場合) によって決まります。

入出力リストに項目が 1 つ以上指定されていれば、 形式仕様にも、データ編集記述子が 1 つ以上必要です。 空の形式仕様 (括弧のみ) を使用できるのは、入出力リスト内に項目 がない場合か、または各項目がゼロ・サイズ配列である場合に限られる ことに注意してください。 このような場合に、アドバンス入出力が有効であると、入力レコード が 1 つスキップされるか、または文字を含まない出力レコードが 1 つ 書き込まれます。 非アドバンス入出力の場合には、ファイルの位置は変更されません。

形式仕様は、繰り返し仕様 (r) がある場合を除いて、 左から右に向かって解釈されます。 繰り返し仕様が前に付いている形式項目は、繰り返し仕様が付いていない 形式仕様または編集記述子と同様の形式仕様あるいは編集記述子 が r 個あるリストとして処理されます。

入出力リストで指定される 1 つの項目は、各データ編集記述子に対応 します。 複素数型のリスト項目には、2 個の FEENESDG、 または拡張精度 Q 編集記述子の解釈が必要です。 各制御編集記述子または文字ストリング編集記述子に対しては、入出力リストで指定される項目は対応しません。 形式制御は、レコードと直接に情報を交換します。

形式制御は、次のように実行されます。

  1. データ編集記述子を検出すると、形式制御は入出力リスト内に項目 があればその項目を処理し、なければ入出力コマンドを終了させます。 処理するリスト項目が複素数型の場合、いずれか 2 つの 編集記述子を処理します。
  2. 入出力リストにそれ以上項目がない場合、コロン編集記述子は、 形式制御を終了させます。 コロンが検出されたときに、入出力リスト内にまだ項目が残っている場合、コロンは無視されます。
  3. 形式仕様の終わりに達すると、入出力リスト全体が 処理されていれば、形式制御が終了し、それ以外の場合は、右括弧のすぐ 手前で終わっている形式項目の始めに戻ります。 後者の場合、次のような項目が適用されます。

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

読み取り操作では、レコード内の未処理文字は、次のレコードが 読み取られるときにすべてスキップされます。 形式指示の形式設定で処理される入力レコード内の非文字データ値 のセパレーターとして、コンマを使用することができます。 コンマがフィールド幅の最後より前にある場合、コンマは形式幅仕様をオーバーライドします。 たとえば、(I10,F20.10,I4) という形式は、以下のレコード を正しく読み取ります。

-345, .05E-3, 12

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

FORMAT ステートメントで Fortran レコードを 定義する場合、 使用する入出力メディアで許可される最大サイズのレコードを考慮に入れること が重要です。たとえば Fortran レコードを印刷する場合、レコードの長さはプリンターの行の長さ以下でなければなりません。

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

コンマで区切られた入出力

形式指示入出力を使用して浮動小数点データを読み取るとき、入力内にコンマがあるとフィールドが終了します。 これは、コンマで区切られた値を含むファイルを読み取る際に便利です。

たとえば、下のプログラムは E 編集記述子を使用して 2 つの実数を読み取ります。 フィールド幅は 16 文字であることが必要です。 このプログラムは、レコード内の残りの文字を文字ストリングとして読み取ります。

> cat read.f
real a,b
character*10 c
open(11, access='sequential', form='formatted')
read(11, '(2e16.10, A)') a,b,c
print *, a
print *, b
print *, c
end

形式の指定どおりに、浮動小数点フィールドの幅が 16 文字である場合は、プログラムが正常に実行されます (0.4000000000E+02 の長さは 16 文字です)。

> cat fort.11
0.4000000000E+020.3000000000E+02hello
> a.out
 40.00000000
 30.00000000
 hello
 

しかし、浮動小数点入力に含まれる文字数が 16 文字を下回る場合は、次のフィールドの一部が読み取られてしまうため、 エラーが発生します (0.400000E+02 の長さは 12 文字です)。

> cat fort.11
0.400000E+020.3000000E+02hello
> a.out
1525-097 A READ statement using decimal base input found the invalid digit
'.' in the input file.
The program will recover by assuming a zero in its place.
1525-097 A READ statement using decimal base input found the invalid digit
'h' in the input file.
The program will recover by assuming a zero in its place.
1525-097 A READ statement using decimal base input found the invalid digit
'e' in the input file.
The program will recover by assuming a zero in its place.
1525-097 A READ statement using decimal base input found the invalid digit
'l' in the input file.
The program will recover by assuming a zero in its place.
1525-097 A READ statement using decimal base input found the invalid digit
'l' in the input file.
The program will recover by assuming a zero in its place.
1525-097 A READ statement using decimal base input found the invalid digit
'o' in the input file.
The program will recover by assuming a zero in its place.
 INF
 0.0000000000E+00
 

フィールドを終了させるためにコンマを使用すると、浮動小数点値が正しく読み取られます (0.400000E+02 の長さは 12 文字ですが、フィールドはコンマで区切られます)。

> cat fort.11
0.400000E+02,0.3000000E+02,hello
> a.out
 40.00000000
 30.00000000
 hello

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

IBM Copyright 2003