| FORTRAN 77 言語リファレンス |
第 5 章
入出力
この章では、Fortran 入出力の一般的な概念について説明します。また、さまざまな入出力の種類についても説明しています。入出力については、『Fortran プログラミングガイド』も参照してください。
FORTRAN 77 入出力の基本概念
UNIX オペレーティングシステムにもとづいたオペレーティングシステムは、Fortran 77 ほど記録処理向きではありません。UNIX オペレーティングシステムは、ファイルを記録の集まりとしてではなく文字の列として扱います。Fortran 77 実行時システムは、実行時にファイル書式と探査モードをチェックします。また、Fortran 77 ライブラリと標準入出力ライブラリを含むファイル機能を提供します。
論理ユニット
プログラムが 1 度に開くことができる論理ユニットの最大数は、Fortran 77 のデフォルトでは 64 です。Solaris では、この制限は 256 です。Fortran 77 プログラムは、
setrlim()関数を呼び出すことによって、この制限を 65 以上に増加することができます。setrlim(2) のマニュアルページを参照してください。cshを実行している場合は、limitまたはunlimitコマンドでも同じことができます。csh(1) を参照してください。標準論理ユニット 0、5、および 6 は、それぞれ 標準エラー
、標準入力、標準出力として事前に結合されています。これらの名前は、実際のファイル名ではないので各装置を開くためには使用できません。INQUIRE文はこれらの名前を戻さず、上記の装置には、実ファイルに対して開かれていないかぎり名前がないことを示します。しかしOPEN文を使用してこれらの装置を再定義することができます。以前に結合された論理ユニットのデフォルトのファイル名でファイルを開きたいときは、その装置をまず閉じてください。標準装置を再定義すると通常のコンソール入出力が損なわれることがあります。代替方法はシェルによる切り替えを使用して、上記の装置を外部的に再定義することです。
デフォルト空白制御や標準入出力ファイルの書式を再定義する場合は、
OPEN文で装置番号を指定し、ファイル名は指定しないでください。また希望する空白制御の種類をオプションで設定してください。入出力エラー
入出力処理中にエラーが検出されると、代わりとなる動作がプログラムの中で特に与えられていなければ、プログラムは処理を異常終了します。入出力文に
ERR=(およびIOSTAT=) 項目を含めて、エラーを発見したときにとる代替分岐先 (および特定のエラーコードを戻すこと) を指定することができます。READ文では、ファイルの最後に達した所で分岐するためにEND=n を含めることができます。ファイル位置と入出力並び項目の値は、エラーの後では未定義です。END=はEOFと誤り条件の両方をとらえます。ERR=は誤り条件だけをとらえます。ユーザーのプログラムが入出力エラーを捕捉しない場合、処理を異常終了する前に、論理ユニット、入出力状態、および大括弧 (
[]) で囲まれたエラー番号を含むエラーメッセージがstderrに書き込まれます。処理を異常終了させるシグナルはIOTです。1000 未満のエラー番号は、オペレーティングシステムのエラーを示します。intro(2) を参照してください。1000 以上のエラー番号は、入出力ライブラリに原因があります。
外部入出力では、バックスペースが可能なファイルからの読み取り中にエラーが起きた場合、現在の記録の一部が表示されます。内部入出力では、文字列中の現在位置に垂直バー (|) を付けて文字列の一部が出力されます。
一般的制限事項
入出力並びでは、実行された際に入出力文の実行を伴うような関数を引用しないでください。例を次に示します。
WRITE( 1, 10) Y, A + 2.0 * F(X) ! F() が入出力を行うのは間違い入出力の種類
f77でサポートされている入出力の種類には、書式付き、書式なし、バイナリ © 、並び、およびNAMELISTがあります。ファイルへの探査には順番と直接という 2 つのモードがあります。ファイルを開くと、探査モードは順番または直接に設定されます。ユーザーが明示的に設定しなければ、デフォルトで順番に設定されます。
ファイルには外部と内部の 2 つの型があります。外部ファイルは、たとえばディスクやテープのような物理的な周辺装置上に常駐します。内部ファイルは主記憶装置内にあります。内部ファイルは文字型で、変数、部分列、配列、配列要素または構造体記録の欄のいずれかです。内部ファイルは周辺装置のように読み取ったり、書き込んだりすることができます。
入出力の組み合わせ
順番探査、書式なし 直接探査、並びによる入出力 順番探査、書式付き 直接探査、変数群入出力 順番探査、並びによる 内部ファイルの変数群入出力 順番探査、変数群 書式なし、内部入出力 直接探査、書式なし バイナリ、直接探査 © 直接探査、書式付き バイナリ、書式付き © バイナリ、順番探査、書式なし ©
以下の表は入出力書式、探査モード、および物理ファイルの型の組み合わせを示します。
並びによる内部ファイルの書き込みは避けてください。行数と行毎の項目数は項目の値で変わります。
プリントファイル
OPEN文の中で規格外のFORM='PRINT'を使用するとプリントファイルが得られます。©
OPEN ( ..., FORM='PRINT', ... )定義
- 書式付き出力の場合、その論理ユニットに対して垂直書式制御が可能です。
- 桁 1 は出力されません。
- 桁 1 が空白、0、または 1 のときは、それぞれ 1 行、2 行またはページの先頭へ行送りします。
- 桁 1 が + のときは、制御処理によって前の行の先頭へ戻るような制御シーケンスに置き換えられます。
- 並びによる出力の場合、その論理ユニットに対して以下のものが得られます。桁 1 は出力されません。
一般に
FORM='PRINT'でファイルを開くと、並びによる出力は桁 1 に Fortran 77 規格の空白を与えず、FORM='PRINT'以外で開いた場合はその空白を与えます。FORM='PRINT'は、1 回の呼び出しにつき 1 ファイルに対応します。
FORM='PRINT'で開いたファイルの内容は、FORM='FORMATTED'で開き、出力フィルタasaでフィルタされたものと同じになります。
-oldldoオプション (旧の並びによる出力) を設定してコンパイルすると、プログラムによって書き込まれるすべてのファイルは、桁 1 に FORTRAN 77 規格の空白を与えずに並びによる出力を行いますが、それ以外のときのすべてのファイルは、空白を与えられます。-oldldoオプションは大域的です。
INQUIRE文
INQUIRE文は、'、FORM変数の中で 'INQUIRE文は、開かれていないファイルの装置番号に対しては -1 を返します。
OPENの特殊用途論理ユニットがすでに開かれていると、
BLANKオプションを使用したOPEN文は何も実行せず、そのオプションの再定義だけを行います。規格外の拡張として、論理ユニットがすでに開かれていると、
FORM='PRINT'とFORM='FORMATTED'を切り換えるためにFORMオプションを指定したOPEN文は、何も実行せず、そのオプションの再定義だけを行います。©これら
OPEN文の書式には、ファイル名を含める必要はありません。さらにUNITが標準入力、標準出力、または標準エラーを引用しているときは、ファイル名を含めてはなりません。
OPEN文を使用して装置を結合したときにファイル名パラメータを使用しないと、デフォルトファイル名fort.nn が与えられます。ここで nn は装置番号です。したがって、標準出力をプリントファイルとして再定義するには次の書式を使用してください。
OPEN( UNIT=6, FORM='PRINT')一時 (スクラッチ) ファイル
一時 (スクラッチ) ファイルを作成すると、一般に実行後に消滅します。
OPEN( UNIT=7, STATUS='SCRATCH' )実行終了後に一時ファイルが消失するのを防ぐには、
STATUS='KEEP' を設定してCLOSE文を実行しなければなりません (一時ファイル以外のファイルでは、KEEPがデフォルトです)。
CLOSE( UNIT=7, STATUS='KEEP' )後で再び開く場合は、
INQUIRE文を使用して一時ファイルの実名を取得することを忘れないでください。
IOINITによる入出力初期設定の変更従来の Fortran 77 環境は、通常すべての論理ユニットについてキャリッジ制御を仮定していました。その環境では通常は入力時の空白スペースをゼロと解釈し、実行時に論理ユニットに大域的ファイル名を結合することもよくありました。ルーチン
IOINIT(3F) を呼び出して、以下のような入出力制御パラメータを指定することができます。
- すべての書式付きファイルのキャリッジ制御を認識します。
- 入力ファイルの後続の空白と埋め込みの空白を無視します。
- ファイルを開く時に、ファイルの最初または最後に位置付けます。
- 指定されたパターンのファイル名を事前に論理ユニットに結合します。
CALL IOINIT ( .TRUE., .FALSE., .FALSE., 'FORT', .FALSE.)ユーザーのプログラムが上記のように呼び出しを行うと、Fortran 77 実行時システムは環境を調べて形式
FORTnn の名前を探してから、対応する論理ユニットを順番書式付き入出力として開きます。この例では、次のようにプログラムが装置 7 を開いたとします。
OPEN( UNIT=07, FORM='FORMATTED' )Fortran 77 実行時システムが環境を調べて
FORT07ファイルを探し、それを装置 7 に結合します。一般に名前は PREFIXnn の形式でなければなりません。個々の PREFIX は、
IOINITへの呼び出しの中で指定されます。nn は開く論理ユニットです。9 以下の装置番号は前に '0' を書かなければなりません。詳細は、IOINIT(3F) および『Fortran ライブラリ・リファレンス』を参照してください。例: 外部ファイル
ini1.inpとini1.outを装置 1 と 2 に結合する
demo$ TST01=ini1.inpdemo$ TST02=ini1.outdemo$ export TST01 TST02
demo% setenv TST01 ini1.inpdemo% setenv TST02 ini1.out例: ファイル
ini1.inpとini1.outを装置 1 と 2 に結合します
IOINITは作成されたときに、多くのプログラムにとって十分であることを立証しなければなりません。Fortran で書かれているため同様のユーザー作成ルーチンの例として役立ちます。IOINITのソースコードは次から取り出すことができます。
/opt/SUNWspro/<release>/src/ioinit.f<release>パスは、コンパイラのリリースごとに変わります。
直接探査
直接探査ファイルは、記録番号を指定して読み取り、または書き込みを行う多数の記録で構成されています。直接探査はランダム探査とも呼ばれます。
- 記録はすべて同じ長さでなければなりません。
- 通常、記録はすべて同じ型です。
- 直接探査外部ファイルの論理記録は、ファイルが開かれたときに指定された長さのバイト数を持つ文字列です。
READ文またはWRITE文は、もとになる記録サイズ定義よりも長い論理記録を指定してはなりません。- 短い論理記録は許可されます。
- 直接書式なし入出力の使用に際しては、ユーザーのプログラムが読み取ることを予期している値の数に十分注意しなければなりません。
- 直接探査
READ文およびWRITE文は、引数REC=n を持ちます。この引数は、読み取る記録または書き込む記録の記録番号を与えます (代替の規格外の書式は 'n です)。書式なし入出力
OPEN( 2, FILE='data.db', ACCESS='DIRECT', RECL=20,& FORM='UNFORMATTED', ERR=90 )READ( 2, REC=13, ERR=30 ) X, YREAD( 2 ' 13, ERR=30 ) X, Y 別の書式 ©このコードは直接探査、記録長 20 文字の書式なし入出力のファイルを開き、13 番目の記録をそのまま読み取ります。
書式付き入出力
例: 直接探査、書式付き
OPEN( 2, FILE='inven.db', ACCESS='DIRECT', RECL=20,& FORM='FORMATTED', ERR=90 )READ( 2, FMT='(I10,F10.3)', REC=13, ERR=30 ) A, Bこのコードは直接探査、記録長 20 文字の書式付き入出力のファイルを開き、13 番目の記録を読み取って、それを
(I10,F10.3)書式に従って変換します。内部ファイル
内部ファイルは、定数、変数、部分列、配列、配列の要素、または構造体記録欄のような文字列オブジェクトです。これらはすべて文字型です。変数または部分列の場合には、ファイル中には 1 つの記録しかありません。配列の場合には、各配列要素が記録です。
順番書式付き入出力
FORTRAN 77 規格では、内部ファイルは順番書式付き入出力だけを含みます (ここでは入出力という用語は正確ではありませんが、内部ファイルは
READ文とWRITE文を使用して処理されます)。内部ファイルは、装置番号の代わりに文字オブジェクトの名前を与えて使用します。順番探査内部ファイルからの読み取りは、常に内部ファイルの最初から開始されます。書き込みのときも同様です。
CHARACTER X*80READ( 5, '(A)' ) XREAD( X, '(I3,I4)' ) N1, N2これは出力行イメージを
Xに読み込んで、その後Xから 2 個の整数を読み取ります。直接探査入出力
これはファイル内の記録数を変更できないことを除いて、外部ファイルの直接入出力に類似しています。この場合 1 記録は文字列の配列の単一要素です。
例: 内部ファイル
LINEの 3 番目の記録の直接探査読み取り
書式付き入出力
入力探査
- 外部記録 (または内部ファイル) から文字データを読み取ります。
- 関連付けられた書式の命令に従って、並びの項目を文字形式からバイナリ形式に変換します。
- 変換したデータを並びの各項目に対応する内部記憶領域に格納します。
READ( 6, 10 ) A, B10 FORMAT( F8.3, F6.2 )出力探査
- 並びで指定された各並びの項目に対応する内部記憶領域からデータを獲得します。
- 関連付けられた書式の命令に従って、項目をバイナリ形式から文字形式に変換します。
- 項目を外部記録または内部ファイルに転送します。
- 書式付き出力記録は改行 (newline) で終わります。
REAL A / 1.0 /, B / 9.0 /WRITE( 6, 10 ) A, B10 FORMAT( F8.3, F6.2 )書式付き
WRITE文の場合、論理記録長は実行時に入力変数、または出力変数の並び (入出力並び) と相互に作用するFORMAT文によって決定されます。書式付き
WRITE文の場合、外部データ表現が指定された欄の幅に対して大きすぎるときは、指定された欄はアスタリスク (*) で満たされます。書式付き
READ文の場合、並びの項目数がデータの欄数より少ないとき、余分の欄は無視されます。書式指定子
FORMAT文の中、および入出力ライブラリルーチンへのすべての英字引数の中の書式指定子には、小文字だけでなく大文字も使用できます。w、m、d、e パラメータ (
Gw.dEe の場合)
- w と e は 0 以外の符号なし整定数です。
- d と m は 符号なし整定数です。
- w は欄が w 桁を占めることを指定します。
- m は、m 桁になるように先行のゼロを挿入することを指定します。
- d は小数点以下が何桁かを指定します。
- e は指数欄の幅を指定します。
w、d、e のデフォルト値
欄指示子 w、d、または e なしで欄記述子
A、D、E、F、G、I、L、O、またはZを書くことができます。© これらが指定されないままのとき、入出力並び要素のデータの型にもとづいて適切なデフォルトが使用されます。表 5-3 を参照してください。w、d、または e を使用する一般的な書式欄記述子を次に示します。
Aw, Iw, Lw, Ow, Zw, Dw.d, Ew.d, Gw.d, Ew.dEe, Gw.dEe例:
INTEGER*2に対してデフオルト w=7 の場合 (10進数 161=16進数 A1)
INTEGER*2 MM = 161WRITE ( *, 8 ) M8 FORMAT ( Z )END
demo% f77 def1.fdef1.f:MAIN:demo% a.outDDDDDa1demo%D は、空白文字の位置を示します。w、d、および e のデフォルト値を以下にまとめます。
複素数項目の w の値は各実数成分に対する値です。文字データを持つ
A記述子のデフォルトは、対応する入出力並びの要素の宣言された長さです。REAL*16とCOMPLEX*32は SPARC のみです。アポストロフィ編集 (`aaa')
アポストロフィ編集指定子は文字定数の書式を使用します。このため編集指定子自身に囲まれた文字 (空白を含みます) が書き込まれます。アポストロフィ編集指定子を入力に使用してはなりません。欄の幅は区切り用のアポストロフィの間に含まれる文字数です (区切り用のアポストロフィは含みません)。欄の中にあって間に空白がない 2 個の連続するアポストロフィは、1 個のアポストロフィとして数えられます。同様の方法で引用符も使用できます。
例:
apos.f、アポストロフィ編集 (等価な 2 つの方法)
WRITE( *, 1 )1 FORMAT( 'これはアポストロフィ''です。')WRITE( *, 2 )2 FORMAT( "これはアポストロフィ'です。")END上記の例は「
これはアポストロフィ'です。」を 2 回書き込みます。空白編集 (
B、BN、BZ)
B、BN、およびBZ編集指定子は、数値入力によって埋め込まれた空白と後に続く空白の解釈を制御します。数値入力欄の空白 (先行の空白を除く) は、書式に特定の空白指定子がない場合、現在装置に対して有効な
OPEN文のBLANK=サブオプションの値に応じてゼロと解釈されるか、または無視されます。そのサブオプションのデフォルト値はignore(無視する) なので、BN/BZ/BとBLANK=の両方にデフォルトを使用すればignore(無視する) となります。例: 同じデータを
BZとBNで一度ずつ読み取って出力する例
- 空白制御指定子は入力だけに適用されます。
- 空白制御指定子は別の空白制御指定子に出会うか、または書式解釈が完了するまでは、効果を持ちます。
B、BN、およびBZ指定子は、I形、F形、E形、D形、およびG形編集に対してだけ効果を与えます。キャリッジ制御 (
$、スペース、0、1)キャリッジ制御として、編集記述子の
$およびスペース、0、または1を使用します。ドル記号 $
この処理は書式の第 1 文字に依存しません。
$は一般にコンソールプロンプトに使用されます。たとえば入力応答が出力されたプロンプトと同じ行に続くようにするために、この記述子を使用することができます。この編集記述子は、コロン (:) と同じ規則によって制約されます。
* dol1.f スペースを伴う $ 編集記述子WRITE ( *, 2 )2 FORMAT (' ノード番号を入力してください: ', $ )READ ( *, * ) NODENUMEND上記のプログラムにより、次のようなプロンプトとユーザーの入力応答が表示されます。
ノード番号を入力してください: 82書式の第 1 文字には、この場合空白が出力されます。入力文の場合
$記述子は無視されます。スペース、0、1、+
表 5-4 空白、0、1、+ によるキャリッジ制御 D (スペース)1 行 02 行 1次ページの最初の行へ行送り +改行なし (標準出力のみ、ファイルでは無効)
書式の第 1 文字が スペース、
0、1、+以外のときは、スペースとして扱われ出力されません。最初の桁の文字が + の場合、前の行の先頭に戻るような制御シーケンスに置き換えられます。
asaを通じてパイプされていると、スペース、0、1、および+は標準出力に対して働きます。例:第 1 文字の書式化、標準出力が
asaを介してパイプされます。
次のようにプログラム
slew1.fは、lpで印刷するとファイルslew1.outを作成します。
bcd
efg
hij
klmnop これは新しいページに始まる。+nop の + のため
demo%cat slew1.outbcdefghij nop これは新しいページに始まる。+nop の + のためdemo%スペース、0、 1 および + は、次のような条件で開いたファイルに対して動作します。
次のようにプログラム
slew2.fは、lpで印刷するとファイルslew2.outを作成します。ファイルslew2.outは、前述したファイルslew1.outと同じです。桁 1 の 改行制御コード '
0'、 '1' と '+' は、出力ファイルの中でそれぞれ' \n'、' \f' と ' \r'に置換されます。文字編集 (
A)
A形指定子は文字型データ項目に使用されます。一般書式を次に示します。
A[w]さまざまな n の値についてサイズ変数 n (
CHARACTER*n) を読み取る例を以下に示します。たとえば、n=9のときは次のとおりです。
CHARACTER C*9READ '( A7 )', C
CHARACTER C*n のさまざまな n の値を以下の表に示します。
データ NodeDIdNode DIdNode DId書式 A7A7A7 メモリー NodeDIde DIdd
出力例: 3 文字、5 文字、および 7 文字の文字列の出力 (それぞれ 5 文字の欄に出力)
PRINT 1, 'The', 'whole', 'shebang'1 FORMAT( A5 / A5 / A5 )END
DDThewholesheba
f77ではFORMAT文、代入文、およびDATA文の中で文字定数が使用できるときは、どのような場合でもホレリス定数を使用できます。© これら定数はお勧めできません。Fortran 77 規格は、旧プログラムとの互換性を改善するためホレリス機能を備えることを勧めていますが、Fortran 77 はこれら旧ホレリス (nH) 表記法を持っていません。このような定数は並びによる入力または変数群入力の入力データ要素として使用できません。
10 FORMAT( 8H Code = , A6 )20 FORMAT( ' Code = ', A6 )
10 FORMAT( 5H flex 4Hible )ホレリス編集記述子への読み込み
旧プログラムとの互換性のため、
f77もホレリス編集記述子へ読み込むことが
できます。©例: ホレリス編集記述子への読み込み。
READ文に並びがないことに注意してください。
demo% cat hol1.fWRITE( *, 1 )1 FORMAT( 6Holder )READ( *, 1 )WRITE( *, 1 )ENDdemo% f77 hol1.fhol1.f:MAINdemo% a.outoldernewernewerdemo%上記の例で書式が実行時書式 (変数書式) のときは、上記の実際の書式への読み込みは行われず、書式は変更されないままです。つまり、次のような読み込みは失敗します。
CHARACTER F*18 / '(A8)' /READ(*,F) ! <- 読み込みは行われない...どちらにしても、実際の書式へ読み込むためのより良い方法があることは明らかです。
整数編集 (
I)
I形指定子は 10 進整数データ項目に使用されます。一般書式を次に示します。
I[w[.m]]
Iw とIw.m 編集指定子は、編集する欄が w 桁を占めることを示します。指定された入出力並びの項目は整数型でなければなりません。入力時に指定される並びの項目は、整数データで定義されることになります。出力時に指定される並びの項目は、整数データとして定義されなければなりません。入力時には、
Iw.m 編集指定子はIw 編集指定子と同等に扱われます。
Iw.m 編集指定子の出力欄は、符号なし整定数が少なくとも m 桁で構成され、必要に応じて先行のゼロを持つこと以外は、Iw 編集指定子と同じです。m の値は w の値を超えてはなりません。m がゼロで項目の値もゼロのときは、有効な符号制御に関係なく、出力欄は空白文字だけで構成されます。
CHARACTER LINE*8 / '12345678' /READ( LINE, '(I2, I3, I2 )') I, J, KPRINT *, I, J, KEND
12 345 67
N = 1234PRINT 1, N, N, N, N1 FORMAT( I6 / I4 / I2 / I6.5 )END
12341234**01234論理編集 (
L)
L形指定子は論理データ項目に使用されます。一般書式を次に示します。
Lw
Lw 編集指定子は欄が w 桁を占めることを示します。指定された入出力並びの項目は論理型でなければなりません。入力時には並びの項目は論理データで定義されることになります。出力時には並びの項目は論理データとして定義されなければなりません。入力欄は省略可能な空白、その後に省略可能な小数点、さらにその後に真のときは
T、偽のときはFが続きます。TまたはFの後の欄内に文字を付けることが可能です。論理定数 .TRUE. と .FALSE. は入力として受け入れられます。出力欄は w-1 個の空白の後に真のときはT、偽のときはFが続きます。
LOGICAL A*1 /.TRUE./, B*2 /.TRUE./, C*4 /.FALSE./PRINT '( L1 / L2 / L4 )', A, B, CEND
TDTDDDF
LOGICAL*4 A1 READ '(L8)', APRINT *, AGO TO 1END上記のプログラムは次の入力データを有効なデータとして受け入れます。
t true T TRUE .t .t. .T .T. .TRUE. TooTruef false F FALSE .f .F .F. .FALSE. Flakey8 進および 16 進編集 (
O,Z)
FORMAT文のO形とZ形欄記述子はそれぞれ 8 進または 16 進整数用ですが、それらはどのデータの型でも使用できます。©
Zw[.m]ここで w は外部欄内の文字数であり、出力の場合 m が指定されている時は、外部欄内の合計桁数が決定されます (つまり m 個に満たないゼロでない桁がある場合、その欄は合計で m 桁になるまで左側にゼロが満たされます)。m は入力には影響を与えません。
8 進および 16 進入力
FORMATにO形またはZ形欄記述子を持つREADは、それぞれ 8 進または 16 進整数として w 文字を読み込み、対応する入出力並びのメンバーに値を割り当てます。
654321
READ ( *, 2 ) M2 FORMAT ( O6 )上記のようなデータとプログラムでは、8 進値 654321 が変数 M に読み取られます。さらに詳しい例を次の表に示します。
表 5-6 8 進/16 進入力値の例 O4 1234D1234O4 162341623O3 97DDDエラー: 9 は許可されない Z5A23DEDA23DEZ5A23DEFA23DEZ495.AF2エラー: ピリオド (.) は許可されない
- 8 進値の場合、外部欄は数値 0〜7 だけを含むことができます。
- 16 進値の場合、外部欄は数値 0〜9 および文字
A〜F、またはa〜fだけを含むことができます。- 符号、小数点、および指数欄は許可されません。
- 全て空白の欄はゼロの値を持つものとして扱われます。
- データ項目が対応する変数に対して長すぎるときは、エラーメッセージが表示されます。
8 進および 16 進出力
FORMATにO形またはZ形欄記述子を持つWRITEは、それぞれ 8 進または 16 進整数として値を書き出します。w 文字の幅の欄に右詰めで書き込まれます。
M = 161WRITE ( *, 8 ) M8 FORMAT ( Z3 )END上記のプログラムは
A1(10 進数 161=16 進数 A1) を表示します。
DA1
表 5-7 8 進/16 進出力値の例 O632767D 77777O214251**O4.327D 033O4.4270033O6-32767*****Z4327677FFFZ3.32708A94Z6.42708DD 0A94Z5-32767******
- 負の値は符号なしのように書き込まれ、マイナス符号は出力されません。
- 外部欄は必要であれば、最大 w の幅まで先行するスペースで満たされます。
- 欄が狭すぎる場合はアスタリスクで満たされます。
- m が指定されると、欄は m の幅になるまで先行するゼロで左側から満たされます。
位置付け編集
f77は出力行に沿った水平位置付けに関しては、書式Tn、TLn、TRn、nT、およびnXをサポートします。ここで n は正の整数でなければなりません。書式指定子Tは単独に、または正のゼロでない数の前後に置くことができます。Tn -- 絶対値桁
タブは n 番目の桁から読み取るか、または n 番目の桁へ書き込みます。n がないときは、
T1として処理されます。TLn -- 相対桁
タブは左側の n 番目の桁から読み取るか、または左側の n 番目の桁へ書き込みます n がないときは、
TL0として処理されます。©TRn -- 相対桁
タブは右側の n 番目の桁から読み取るか、または右側の n 番目の桁へ書き込みます n がないときは、
TR0として処理されます。©nT -- 相対タブストップ ©
タブにより読み取りのときも書き込みのときも、n 番目のタブストップに移動します。n が省略されると n=1 が使用され、次のタブストップに移動します。(この編集は、FORTRAN 77 の規格外です。)
- 入力論理記録の終わりを越えて右へタブ操作するとエラーになります。
- 入力論理記録の始まりを越えて左へタブ操作すると、入力ポインタは記録の始めに置かれます。
- 内部書式付き入出力と外部書式付き入出力の両方について、非破壊的なタブ操作が可能です。非破壊的なタブ操作とは、出力の左または右へのタブ操作が記録の先に書かれた部分を破壊しないということです。
- 出力の右へのタブ操作により記録の書き込まれていない部分は空白で満たされます。
- 出力の左へのタブ操作は論理ユニットがシークを許可することを必要とします。したがって端末との入出力つまりパイプは許可されません。
- 同様にどちらの方向にせよ非破壊的なタブ操作はシークできる装置でのみ可能です。それ以外の場合には、右へのタブ操作または
X編集指定子による空白処理は出力に空白を書き込みます。- タブストップは、8 桁ごとに固定されています。
nX -- 位置
n
X編集指定子は記録への、または記録からの次の文字の転送を現在の位置から n 文字先の位置で行うことを指示します。入力時、n
X編集指定子は記録ポインタを n 桁進めるので、n 文字スキップします。記録の最終文字を越えた位置は、この位置から文字が転送されない場合は指定することができます。
demo% cat rtab.fCHARACTER C*2, S*2OPEN( 1, FILE='mytab.data')DO I = 1, 2READ( 1, 2 ) C, S2 FORMAT( T5, A2, T1, A2 )PRINT *, C, SEND DOENDdemo%
demo% cat mytab.datadefguvwx12345678demo%
demo%a.outuvde5612demo%上記の例では、まず桁 5 と 6 を、次に桁 1 と 2 を読み取ります。
例: 出力
Tn (絶対タブ) ― このプログラムは出力ファイルを書き込みます。
demo% cat otab.fCHARACTER C*20 / "12345678901234567890" /OPEN( 1, FILE='mytab.rep')WRITE( 1, 2 ) C, ":", ":"2 FORMAT( A20, T10, A1, T20, A1 )ENDdemo%
demo% cat mytab.rep123456789:123456789:demo%上記の例は 20 文字を書き込み、桁 10 と 20 を変更しました。
例: 入力
TRn およびTLn (相対タブ) ― プログラム
demo% cat rtabi.fCHARACTER C, S, TOPEN( 1, FILE='mytab.data')DO I = 1, 2READ( 1, 2 ) C, S, T2 FORMAT( A1, TR5, A1, TL4, A1 )PRINT *, C, S, TEND DOENDdemo%
demo% cat mytab.datadefguvwx12345678demo%
demo% a.outdwg174demo%上記の例は、桁 1 を読み取ってから桁 7 まで 5 桁右に移動し、その後桁 4 まで 4 桁左に移動します。
例:
TRn とTLn の出力 (相対タブ) ― このプログラムは出力ファイルを書き込みます。
demo% cat rtabo.fCHARACTER C*20 / "12345678901234567890" /OPEN( 1, FILE='rtabo.rep')WRITE( 1, 2 ) C, ":", ":"2 FORMAT( A20, TL11, A1, TR9, A1 )ENDdemo%実行しても何も表示しませんが、
mytab.rep出力ファイルを見ることができます。
demo% cat rtabo.rep123456789:123456789:demo%上記のプログラムは 20 文字を書き込んでから桁 10 まで 11 桁左に移動し、その後桁 20 まで 9 桁右に移動します。
引用符編集 ("
aaa")引用符編集指定子は文字定数の書式を使用します。© 引用符編集指定子は編集指定子自身が囲んだ文字 (空白を含みます) を書き込みます。引用符編集指定子は入力に使用してはなりません。
欄の幅は区切り用引用符の間に含まれる文字数ですが、区切り用の引用符は含みません。欄内にあって間に空白がない 2 個の連続する引用符は、1 個の引用符として数えられます。同様の方法でアポストロフィを使用することができます。
WRITE( *, 1 )1 FORMAT( 'これは引用符 " です。' )WRITE( *, 2 )2 FORMAT( "これは引用符 "" です。" )ENDこれはメッセージ「これは引用符
"です。」を 2 回書き込みます。基数制御 (
R)書式指定子は
Rまたは nRです。ただし 2≦n≦36 です。n が省略されると、デフォルトの 10 進基数が復元されます。基数制御により書式付き整数入出力変換に 10 以外の基数を指定することができます。この指定子は浮動小数点変換の桁移動
Pにならっています。他の基数が指定されるか、または書式解釈が終了するまでは効果を持ち続けます。入出力項目は 32 ビット整数として扱われます。例: 基数が 16 で、符号なし、16 進の整数、10 の幅を持ち、8 桁までゼロで満たす書式は (
su,16r,I10.8) となります。
demo% cat radix.finteger i / 110 /write( *, 1 ) i1 format( su, 16r, I10.8 )enddemo% f77 -silent radix.fdemo% a.outDD0000006Edemo%
SUについては、「符号編集 (SU、SP、SS、S)」で説明します。実数編集 (
D、E、F、G)
D形、E形、F形、およびG形指定子は、10 進の実数データ項目に使用されます。
D形編集
D形指定子は 10 進倍精度項目の指数書式に使用されます。一般書式を次に示します。
D[w[.d]]
Dw およびDw.d 形編集指定子は、編集する欄が w 桁を占めることを示します。d は数の小数部 (小数点の右側の部分) が d 桁であることを示します。しかし入力データが小数点を持つ場合は、その小数点が d の値を無効にします。入力時に指定される並びの項目は、実数データで定義されることになります。出力時に指定される並びの項目は、実数データとして定義されなければなりません。
出力文では、
Eの代わりにDが使用されること以外は、D形編集記述子がE形編集記述子と同じことを行います。Dw.d 形編集指定子に対する出力欄は幅 w を持ちます。値は欄に右詰めされます。欄はゼロまたは 1 個以上の先行する空白の次にマイナス (値が負のとき) または省略可能なプラスがあり、さらに d 桁の 10 進数に丸められた並び項目の値の大きさが続きます。w は、マイナス符号、小数点の左側の 1 桁以上の数字、小数点、および小数点の右側の
d 桁までの数字を許可しなければなりません。したがって、この場合 w≧d+3 でなければなりません。
CHARACTER LINE*24 / '12345678 23.5678 .345678' /READ( LINE, '( D8.3, D8.3, D8.3 )') R, S, TPRINT '( D10.3, D11.4, D13.6 )', R, S, TEND
0.123D+05 0.2357D+02 0.345678D+00上記の例で最初の入力データ項目は小数点を持たないので
D8.3が小数点を決定します。その他の入力データ項目は小数点を持つので、小数点に関する限りこれらの小数点がD形編集記述子を無効にします。
R = 1234.678PRINT 1, R, R, R1 FORMAT( D9.3 / D8.4 / D13.4 )END
0.123D+04********DDD0.1235D+04上記の例で 2 番目の出力行は
D8.4が符号を許可しないのでアスタリスクになり、3 番目の出力行はD13.4の結果として先頭に 3 個の空白がきます。
E形編集
E形指定子は 10 進の実数データ項目の指数書式に使用されます。一般書式を次に示します。
E[w[.d][Ee]]d は数の小数部 (小数点の右側の部分) が d 桁であることを示します。しかし入力データが小数点を持つ場合は、その小数点が d の値を無効にします。
e は指数欄の桁の数を示します。デフォルトは 2 になります。
指定される入出力並びの項目は実数型の項目でなければなりません。入力時に指定される並びの項目は実数データで定義されることになります。出力時に指定される並びの項目は実数データとして定義されなければなりません。
Ew.d 形編集指定子に対する出力欄は幅 w を持ちます。値はその欄に右詰めされます。欄はゼロまたは 1 個以上の先行する空白のあとに、マイナス (値が負のとき) または省略可能なプラスが続き、さらにゼロ、小数点、d 桁の 10 進数に丸められた並びの項目の値の大きさおよび指数が続きます。書式
Ew.d は指数の絶対値によって以下のようになります。書式
Ew.dEe は、|指数|(10e) -1 ならば、指数は書式 nnn になります。
書式
Dw.d は指数の絶対値によって以下のようになります。w はマイナス符号を許可する必要はありませんが、ゼロ、小数点、および小数点の右側の d 桁の数字、および指数を許可しなければなりません。したがって、負数でないときは w � d+6 ですが、 e があれば w � d+e+4 です。負数のときは w � d+7 ですが、 e があれば w � d+e+5 です。
CHARACTER L*40/'1234567E2 1234.67E-3 12.4567 '/READ( L, '( E9.3, E12.3, E12.6 )') R, S, TPRINT '( E15.6, E15.6, E15.7 )', R, S, TEND
DDD0.123457E+06DDD0.123467E+01DD0.1245670E+02上記の例で最初の入力データ項目は小数点を持たないので
E9.3が小数点を決定します。その他の入力データ項目は小数点を持つので、小数点に関する限りこれら小数点がD形編集記述子を無効にします。
R = 1234.678PRINT 1, R, R, R1 FORMAT( E9.3 / E8.4 / E13.4 )END
0.123E+04********DDD0.1235E+04上記の例で
E8.4は符号を許可しないのでアスタリスクが出力されます。またE13.4の余分な幅の欄は 3 個の先行する空白になります。例:
Ew.dEe 形編集を設定した実出力。プログラムEwdEe.f
REAL X / 0.000789 /WRITE(*,'( E13.3)') XWRITE(*,'( E13.3E4)') XWRITE(*,'( E13.3E5)') XEND
DDDD0.789E-03DD0.789E-0003D0.789E-00003
F形編集
F指定子は 10 進の実数データ項目に使用されます。一般書式を次に示します。
F[w[.d]]
Fw とFw.d 形編集指定子は編集する欄が w 桁を占めることを示します。d は数の小数部 (小数点の右側の部分) が d 桁であることを示します。しかし入力データが小数点を持つ場合は、その小数点が d の値を無効にします。
指定される入出力並びの項目は、実数型の項目でなければなりません。入力時に指定される並びの項目は、実数データで定義されることになります。出力時に指定される並びの項目は、実数データとして定義されなければなりません。
Fw.d 形編集指定子に対する出力欄は幅 w を持ちます。値はその欄に右詰めされます。欄はゼロまたは 1 個以上の先行する空白のあとにマイナス (値が負のとき) または省略可能なプラスが続き、さらにその次に d 桁の 10 進数に丸められた並びの項目の値の大きさが続きます。w はマイナス符号、小数点の左側の 1 桁以上の数字、小数点、および小数点の右側の
d 桁の数字を許可しなければなりません。したがってこの場合は、w � d+3 でなければなりません。
CHARACTER LINE*24 / '12345678 23.5678 .345678' /READ( LINE, '( F8.3, F8.3, F8.3 )') R, S, TPRINT '( F9.3, F9.4, F9.6 )', R, S, TEND
12345.678DD23.5678D0.345678上記の例で、最初の入力データ項目は小数点を持たないので
、F8.3が小数点を決定します。その他の入力データ項目は小数点を持つので、小数点に関する限りこれら小数点がF形編集記述子を無効にします。
R = 1234.678PRINT 1, R, R, R1 FORMAT( F9.3 / F8.4 / F13.4 )END
D1234.678********DDDD1234.6780上記の例で
F8.4は符号を許可しません。F13.4により 先頭に 4 個の空白がきて、後ろに 1 個のゼロがきます。
G形編集
G形指定子は 10 進の実数データ項目に使用されます。一般書式を次に示します。
あるいは Gw.dEe
D、E、F、およびG形編集指定子は同じ方法でデータを解釈します。
G形編集記述子による出力の表現は内部データの大きさに左右されます。次の表で N は
内部データの大きさを示します。
0.1N < 1.0
1.0N < 10.0
...10(d-2)N
10(d-1)
10(d-1)N < 10d
F(w-4).dF(w-4).(d-1)...F(w-4).1F(w-4).0
書式付き入力のコンマ
固定桁書式で制御される数値データを入力するとき、コンマを使用して桁の制限を無効にすることができます。
(I10, F20.10, I4)上記の書式を使用すれば次の記録を正しく読み取ることができます。
-345,.05e-3,12入出力システムは FORTRAN 77 規格に記述されているよりも寛大になっています。一般に文字以外の変数の書式付き読み取りを行う場合、コンマは欄の長さを変更します。正確に言うと
Iw、Fw.d、Fw.d[Ee]、およびGw.d の入力欄の場合、w 個の文字が走査されるか、またはコンマがあると欄は終了します。コンマで終了したとき欄はコンマまでの文字を含みますが、コンマは含みません。次の欄はコンマの次の文字で始まります。残存文字 (
Q)
Q形編集記述子は入力記録の長さ、または入力記録の読み取られていない残存部分の長さを知るために使用されます。©
上記の例は、変数
Rに欄を読み込んでからその欄の後に残っている文字数をLに読み込み、それからLの文字をCVECTに読み込みます。n 番目の編集記述子としてのQは、READ並び内の n 番目の要素としてのLと一致します。
上記の例は入力記録の長さを獲得します。これで入力文字列全体とその長さについてはユーザー自身が解析することができます。
- 対応する並びの要素は
、INTEGERまたはLOGICALデータ型でなければなりません。Qは厳密に文字を数えます。入力記録中に残っている文字の数を獲得します。整数、実数またはその他の数は獲得しません。Q編集記述子はパイプファイルに適用することはできません。ファイルは再読み取り可能であることが必要です。- この記述子はファイルと
stdin入力(端末) 入力に対して有効です。- この記述子は出力には使えず、実行時にエラーが発生します。
桁移動 (
P)
P形編集記述子は実数の入力値を 10 のべき乗だけ桁移動します。出力値に対しては、表示される有効数字を制御します。
パラメータ 説明 k 符号なしまたは符号付きの整定数[k]P
READ ( 1, '( 3P E8.2 )' ) XWRITE ( 1, '( 1P E8.2 )' ) X
P自身だけのときは0Pと等価です。Pは桁移動数をデフォルト値0Pにリセットします。P単独は規格外です。©有効範囲
桁移動数は、各入出力文の実行を開始する時にゼロにリセットされます。桁移動数は
D、E、F、およびG形編集記述子に適用されます。入力
入力時、指数欄を持たない外部データは、10k で除算されてから内部的に格納されます。
データ 書式 E8.2 3P E8.2 3P E8.2 -3P E8.2メモリー 18.63 .01863 18.63E2 18630.出力
D形、E形記述子を使用する出力、またはE形編集に対応するG形記述子を使用する出力時に、内部項目は基本の実定数部に 10k を乗じられ、指数部は k だけ減らされて、書き出されます。
F形記述子を使用する出力、およびF形編集に対応するG形記述子を使用する出力時に、内部項目は基本の実定数部分に 10k を乗じられた後に書き出されます。
メモリー 290.0
290.0
290.0
290.0
書式 2P E9.3 1P E9.3 -1P E9.3 F9.3表示 29.00E+01 2.900E+02 0.029E+04 0.290E+03符号編集 (
SU、SP、SS、S)
SU形、SP形、およびS形編集記述子は先行する符号の出力を制御します。特殊な符号指定子がない通常の出力の場合、値が負のときはマイナス符号が左端の桁の 1 桁左に出力されます。値が正のときは処理系によってはプラス符号が出力されますが、f77はプラス符号を省略します。
SP−SPが指定の前にあるときは符号が出力されます。SS−SSが指定の前にあるときはプラス符号の出力は抑止されます。S−Sが指定の前にあるときはシステムのデフォルトが有効となります。デフォルトはSSです。SU−SUが指定の前にあるときは整数値は符号なしと解釈されます。これは規格外です。©たとえば符号なし指定子は、次に示すように基数指定子とともに使用して、16 進数ダンプを書式化することができます。
2000 FORMAT( SU, 16R, 8I10.8 )
- 符号制御指定子は出力だけに適用されます。
- 符号制御指定子は別の符号制御指定子に出会うか、または書式解釈が終了するまでは有効です。
S形、SP形、およびSS形指定子はI形、F形、E形、D形、およびG形編集だけに影響を与えます。SU形指定子はI形編集だけに影響を与えます。スラッシュ編集 (/)
スラッシユ (
/) 編集指定子は現在の記録におけるデータ転送の終了を指示します。順番探査
入力時は現在の記録の残りの部分を無視し、ファイルは次の記録の先頭に位置付けられます。2 個の連続するスラッシュ (
//) は記録全体を無視します。出力時は記録終了が書き込まれ、新しい記録が開始されます。2 個の連続するスラッシュ (
//) は文字なしの記録を作成します。ファイルが内部ファイルのとき、その記録は空白で満たされます。直接探査
各スラッシュは記録番号を 1 つずつ増やし、ファイルをその番号の記録の先頭に位置付けます。
出力時、2 個の連続するスラッシュ (
//) は文字なしの記録を作成します。その記録は空白で満たされます。終了制御 (:)
コロン (:) 編集記述子により書式を条件付きで終了することができます。入出力並びが書式の途中で尽きると書式はコロンで終了します。
* col1.f コロン (:) 編集記述子DATA INIT / 3 /, LAST / 8 /WRITE ( *, 2 ) INITWRITE ( *, 2 ) INIT, LAST2 FORMAT ( 1X 'INIT = ', I2, :, 3X, 'LAST = ', I2 )END
INIT = 3INIT = 3 LAST = 8
INIT = 3 LAST =INIT = 3 LAST = 8実行時書式
実行中に変更可能な書式指定子をオブジェクトの中に設定することができます。これによって柔軟性が向上します。この種類の書式指定子は、入出力文が実行されるたびに解析されるので、実行時間は増加します。これらは変数書式とも呼ばれます。
区切るのに左右の括弧が必要です。ただしキーワード
FORMATと文番号は除きます。オブジェクトは書式全体を設定するのに十分な大きさで宣言しなければなりません。たとえば、
'(8X,12I)' はINTEGER*4またはCHARACTER*4オブジェクトには適しません。
書式内の変数式 (<
e>)一般に
FORMAT文内の整定数は任意の式で置換することができます。©
1 FORMAT( 3F6.1 )
1 FORMAT( 3F<N>.1 )または次のように、さらに複雑な式
2*N+Mでも置換可能です。
1 FORMAT( 3F<2*N+M>.1 )同様に、
3または1を任意の式で置換することができます。
- 式は書式走査中に出会うたびに再評価されます。
- 必要であれば、式は整数型に変換されます。
- 関数呼び出しを含めて正しい Fortran 77 式はすべて許可されます。
- 変数式は、実行時に生成される書式では使用できません。
- n
H... 編集記述子の n は変数式にすることができません。書式なし入出力
書式なし入出力は、2 進情報をその内部表現を変更することなく、メモリーとの間で転送するために使用されます。書式なし入出力文の実行のたびに単一の論理記録の読み取り、または書き込みが行われます。内部表現はアーキテクチャにより異なるので、書式なし入出力は移植性に限界があります。
書式なし入出力を使用して一時的にデータを書き出したり、または迅速にデータを書き出して同一アーキテクチャを持つマシン上で実行される別の Fortran 77 プログラムに入力することができます。
順番探査入出力
書式なし順番探査ファイルの論理記録長は、入出力並び中の項目が必要とするバイト数により異なります。この入出力書式の要求条件により、外部物理記録サイズは論理記録サイズよりいくらか大きくなります。
WRITE( 8 ) A, BFortran 77 実行時システムは、書式なし順番
WRITE中にデータ中の記録境界として、各書式なし順番記録の始めと終わりにINTEGER*4でバイト数を挿入します。記録の終わりのバイト数により、記録のBACKSPACE操作が可能になります。結果として Fortran 77 プログラムは、書式なし順番WRITE操作で書き込まれたデータについてだけ書式なし順番READを使用することができます。このような記録を書式付きとして読み取ろうとすると、その結果は予測できません。
- ファイルがその方法で作成されているとき以外では、書式なし順番
READを使用しないでください。- 各書式なし順番記録の始めと終わりには余分なデータがあるので、その余分なデータが目立つ場合、ユーザーは書式なし直接入出力の使用を試みたいと思うかもしれません。きわめて長い記録よりも、短い記録の時にこれが顕著になります。
直接探査入出力
複数の入出力並びが異なった長さのとき、
RECL=1オプションを設定してファイルを開くことができます。このオプションは読み取り、または書き込みを行う項目の数を決定するために入出力並びを使用することを Fortran 77 に知らせます。ユーザーはさらに各読み取りごとに、読み取りを開始する最初の記録 (この場合どのバイトからか) を Fortran 77 に知らせる必要があるため、各項目のサイズを知っておかなければなりません。©
例: 直接探査 -- それぞれ 2 つの整数からなる記録を 3 個作成する
ファイル上の記録長がわかります。この例では、書き込まれたとおりにファイルを読み込むことができます。
ただし、ファイル上の記録長ではなく各項目のサイズがわかれば、OPEN 文で 、
recl=1を使用して、入出力並びによって読み込む項目の数を確定することができます。
上記の例のように 3 整数 (12バイト) を読み取った後、ユーザーは記録 13 から次の読み取りを開始します。
\xa9 バイナリ入出力
バイナリ入出力でファイルを開くと、プログラムはレコード境界のないバイナリデータのストリームとして、データを読み書きできます。(この機能は Fortran 77 の規格外です)。©
OPEN文におけるFORM = 'BINARY'オプションは次のように、そのユニットがレコードマークのない順番の書式なしファイルであると宣言します。
OPEN(1, FORM='BINARY')バイナリファイルは、直接探査や書式付きとして宣言することもできません。
WRITE文では、バイナリデータは出力並びにあるバイト数と同じバイト数が、バイトのストリームとしてファイルに書き込まれます。READ文では、入力並びで変数が要求したデータバイト数分が読み取られます。ファイルにはレコードマーク (レコードの終わり) がないので、レコードマーク以降が読取られる可能性はありません。プログラムが検出できる状態は、異常なシステムエラーを除くとファイルの終わり (EOF) での読取りだけです。各READ文は以下の例のように、ファイルの次の順番のバイトを読み込むだけです。
バイナリファイルに対する
INQUIREは、FORM =パラメータの場合は'BINARY'、ACCESS=の場合は'SEQUENTIAL'、UNFORMATTED=の場合は'YES'、SEQUENTIALの場合は'YES'を返します。バイナリファイルには
BACKSPACEは使用できず、実行時にはエラーメッセージが出力されます。並びによる入出力
並びによる入出力は、順番探査デバイスのための自由形式の入出力です。これを使用するには、次に示すように書式識別子としてアスタリスクを使用してください。
READ( 6, * ) A, B, C
- 入力時、値は空白文字列と (場合によっては) コンマで分離します。
- 文字列の場合を除いて、値には空白を入れることはできません。
- 文字列は、引用符 (") かアポストロフィ (') で囲んだ文字列、または引用符の付かない文字列です (「引用符の付かない文字列」を参照してください)。
ホレリス (nHxyz) 文字列は使用できません。- 文字列の場合を除いて、記録の終わりは空白と見なされます。文字列では無視されます。
- コンマで分離し、括弧で囲んだ 2 個の実定数が複素定数として与えられます。
- コンマとコンマの間の NULL 入力欄などは、入出力並びの中のこれに対応する変数が変わらないことを示します。
- 次に示すように、入力データ項目の前に繰り返し回数を置くことができます。
4*(3.,2.) 2*, 4*'hello'これは、4 個の複素定数、2 個の NULL 入力欄、4 個の文字列定数を意味します。
- 入力並びの中のスラッシュ (
/) は、並びによる入力で入力並びへの値の割り当ての終わりを示し、現在の入力行にある残りをスキップします。スラッシュに続くテキストは無視され、データ行の注釈に使用されます。出力形式
並びによる出力により、細かい形式に煩わされずに高速で簡単に出力できます。厳密な形式が必要な場合は、書式付き入出力を使用してください。各項目に適した形式が選択され、正確な出力と簡素な出力形式が矛盾する場合は、簡素な形式が選択されます。
- 一般に、各記録は空白から始まります。プリントファイルでは、この空白は出力されません。詳細については、「プリントファイル」を参照してください。©
- 文字列はそのまま出力されます。文字列は引用符で囲まれないため、並びによる入力を使用して読み戻すことができるのは特定の形式の文字列に限られます。これについては次節で説明します。
- 正確な 2 進表記になっていない数は四捨五入されます。
demo% cat lis5.fREAD ( 5, * ) XWRITE( 6, * ) X, ' 美'WRITE( 6, 1 ) X1 FORMAT( 1X, F13.8, ' 真実' )ENDdemo% f77 lis5.flis5.f:MAIN:demo% a.out1.41.40000000 美1.39999998 真実demo%上記の例で、正確な数値が必要な場合は、書式を指定してください。
- 80 文字より長い出力行はできるだけ避けてください。
- 複素数値および倍精度複素数値には、適切な位置にコンマが含まれます。
- 実数、倍精度値、および 4 倍精度値は、書式がそれぞれ異なります。
- 文字列の中のバックスラッシュ
n(\n) はキャリッジリターンとして出力されます。ただし、-xlオプションが設定されている場合は、バックスラッシュnとして出力されます。
バックスラッシュ
demo%cat f77 bslash.fCHARACTER S*8 / '12\n3' /PRINT *, SENDdemo%n
-xlなしで、キャリッジリターンとして\nを出力します。
demo%f77 -silent bslash.fdemo%a.out123demo%
demo%f77 -xl -silent bslash.fdemo%a.out12\n3demo%
COMPLEX*32とREAL*16は、SPARC のみ使用できます。引用符の付かない文字列
f77の並びによる入出力を使用すると、引用符に囲まれない文字列の読み込みを行うことができます。©文字列を数字で始めることはできません。また、分離文字 (コンマまたはスラッシュ (/))、 または空白 (スペースまたはタブ) は含まれません。バックスラッシュ (\) でエスケープしないかぎり、改行 (newline) は文字列の終わりを示します。上記の制限を満たさない文字列は、単一引用符または二重引用符で囲まなければなりません。
CHARACTER C*6, S*8READ *, I, C, N, SPRINT *, I, C, N, SEND上記のプログラムで
unquoted.fを入力すると以下のように表示されます。
demo% a.out23 label 82 locked23label 82lockeddemo%内部入出力
f77は、内部入出力ができるように並びによる入出力を拡張しています。©並びによる内部読み込みでは、入力並びが完成するかファイルの終わりになるまで文字が詰められています。並びによる内部書き込みでは、出力並びが完成するまで記録が埋められます。倍精度値の書き込みの際の論理記録オーバーフローを避けるために、内部配列要素の長さは 20 文字以上にするとよいでしょう。並びによる内部読み込みは、コマンド行の解読を簡単にするために実現されました。並びによる内部出力は避けることをお勧めします。
NAMELIST入出力
NAMELIST入出力を使用すると、変数の全グループの自由形式入出力、または変数のグループ内の選択された項目の入力が実行できます。©
NAMELIST文は、変数または配列のグループを定義します。グループ名を宣言し、そのグループに属する変数および配列を指定します。構文規則
NAMELIST /group-name/namelist[[,] /group-name/namelist]...
パラメータ
説明
group-name
グループ名
namelist
変数または配列をコンマで分離した並び
詳細については、「NAMELIST」を参照してください。
CHARACTER*18 SAMPLELOGICAL*4 NEWREAL*4 DELTANAMELIST /CASE/ SAMPLE, NEW, DELTA変数または配列は、複数の
NAMELISTにリストできます。入力データには、配列要素および文字列を入れることができます。また、入力定数データ文字列は宣言された変数の長さより短くできるため、部分列も入れることができます。
制限事項
グループ名は、
NAMELIST、READ、またはWRITEの各文だけに置くことができ、プログラムに対して一意でなければなりません。並びには、定数、配列要素、仮大きさ引き継ぎ配列、構造体、部分列、記録、記録欄、ポインタ、またはポインタ基底付き変数を入れることはできません。
REAL ARRAY(4,4)CHARACTER*18 SAMPLELOGICAL*4 NEWREAL*4 DELTANAMELIST /CASE/ SAMPLE, NEW, DELTANAMELIST /GRID/ ARRAY, DELTA上記の例で、
DELTAはCASEグループとGRIDグループの両方にあります。出力動作
NAMELIST出力は、WRITE文の特殊な書式を使用します。この出力はグループ名を含むレポートを作成します。グループの各変数の名前とメモリー上の現在の値も含めます。それぞれの変数の型に従って値を書式化し、NAMELISTの入力が読み込める形式のレポートを作成します。
NAMELIST WRITEの構文は次のとおりです。
WRITE ( extu, 変数群指定子 [, iostat] [, err])
ここで、変数群指定子は次の書式を使用します。
[NML=]グループ名
また、グループ名はすでに
NAMELIST文の中で定義されたものです。
NAMELIST WRITE文は、グループ内のすべての変数の値をNAMELIST文と同じ順番で書き込みます。
キーワード
NMLを省略する場合は、先頭に装置パラメータ (UNIT) を、2 番目に変数群指定子を置く必要があることに注意してください。書式指定子は置かないでください。
WRITE ( UNIT=6, NML=CASE )入力動作
NAMELIST入力文は、第 1 桁を飛ばして第 2 桁以降で記号 $ と、指定されたグループ名を探し、次の外部記録を読み込みます。
$グループ名が見つからない場合、入力グループはファイルの最後まで読み込まれます。記録は入力されて、グループの中の名前と一致するデータ中の名前により値が割り当てられ、グループの中の変数のデータ型が使用されます。
入力データの中に見つからないグループの変数は、変更されません。
NAMELIST READの構文は次のとおりです。
READ ( extu, 変数群指定子 [, iostat] [, err] [, end])変数群指定子は次の書式を使用します。
[NML=]グループ名また、グループ名はすでに
NAMELIST文の中で定義されたものです。
CHARACTER*16 SAMPLELOGICAL*4 NEWREAL*4 DELTA, MAT(2,2)NAMELIST /CASE/ SAMPLE, NEW, DELTA, MATREAD ( 1, CASE )この例で、グループ
CASEはSAMPLE、NEW、DELTAの 3 個の変数とMATで構成されます。キーワードNMLを省略する場合は、キーワードのUNITも省略しなければなりません。装置パラメータは先頭に、変数群指定子は 2 番目に置きます。書式指定子は置きません。
READ ( UNIT=1, NML=CASE )データ構文
NAMELIST入力データの最初の記録は、第 2 桁以降に特殊記号の $ (ドル記号) を持ち、その後にNAMELISTグループ名が続きます。この後に、同じ記録かこれに続く記録の第 2 桁以降から始まる一連の代入文が続きます。各記録は、指定されたグループの変数に値を代入します (または 1 個以上の値を配列要素に代入します)。次に示すように、第 2 桁以降に入っているもう 1 つの $ が入力データの終わりを示します。
D$グループ名変数 = 値 [,変数 = 値,... ] $[END]このドル記号の代りにアンパサンド (
&) を使用できます。ただし、開始と終了の区切り文字は同じものでなければなりません。ENDは最後の区切り文字のオプションの部分です。入力データ代入文の書式は、以下のいずれかでなければなりません。
配列 = 値 1[, 値 2,]... 配列(添え字)= 値 1[, 値 2,]... 配列(添え字,添え字)= 値 1[, 値 2,]... 変数 =文字定数 変数 (索引:索引)=文字定数配列に添字が付いている場合、適切な添字の個数がなければなりません。
文字定数を区切るには、引用符 (" または ') を使用してください。文字定数の詳細については、次の項を参照してください。
次のデータ例は、上記のプログラム部分で読み込むためのものです。
D$case delta=0.05, mat( 2, 2 ) = 2.2, sample='デモ' $データは複数の行にまたがることが可能です。ここで、
NEWは入力されませんでした。また、順番はNAMELIST文の中の順番と異なります。
D$caseDdelta=0.05Dmat( 2, 2 ) = 2.2Dsample='Demo'D$構文規則
NAMELISTで読み込まれる入力データには、次の構文規則が適用されます。
- 名前が指定されたグループの変数の順番は任意です。またどれでも省略できます。
- データは第 2 桁以降から始まります。第 1 桁から始めることもできますが、規格外です。©
- 変数の間には、コンマ、スペース、またはタブが少なくとも 1 つ必要です。また、1 個以上のスペースまたはタブは 1 個のスペースに相当します。変数名の前に連続するコンマを置くことはできません。コンマの前後のスペースには意味がありません。
- グループ名および変数名の中にスペース、またはタブを置くことはできません。ただし、添字のコンマの前後、部分列のコロンの前後、および「
(」の後と「)」の前のスペース、またはタブは認められます。1 つの名前が 2 つの記録に渡ることはできません。- 記録の終わりはスペース文字のように処理されます。
- 例外: 文字定数では、記録の終わりは無視され、文字定数は次の記録へ続きます。現在の記録の最後の文字には、次の記録の 2 番目の文字が続きます。どの記録も最初の文字は無視されます。
- 代入文の等号の両側には、空白またはタブが使用できます。
- 添字、部分列の範囲指示子、および変数または配列に代入される値に使用できるのは定数値だけです。実際の入力データに定数名 (パラメータ) は使用できません。
- ホレリス定数、8 進定数、16 進定数は使用できません。
- 代入された定数は、対応する Fortran 77 定数と同じ書式です。
- 定数と定数の間には、少なくとも 1 個のコンマ、スペース、またはタブが必要です。スペースまたはタブが無い場合も、1 個以上ある場合もスペース 1 個に相当します。
1,2,3,1 2 3または1, 2, 3などのように入力します。- 文字定数の中の連続したスペースまたはタブは、圧縮されずに保持されます。
- 文字定数はアポストロフィ (') または引用符 (") で区切ります。ただし、どちらかを使用して文字定数を始めた場合、同じもので終了しなければなりません。アポストロフィを区切り文字として使用する場合、文字列の中にアポストロフィを入れるにはアポストロフィを 2 個続けて使用します。
Dsample='use "$" in 2'(use "$"in 2と解釈される)Dsample='don''t' (don'tと解釈される)Dsample="don''t" (don'tと解釈される)Dsample="don't" (don'tと解釈される)複素定数は、実定数または整定数を 2 個組み合わせ、それをコンマで区切り、括弧で囲みます。スペースはコンマの前後にだけ入れることができます。
論理定数は、真または偽の値の書式です。たとえば、.
TRUE. または .FALSE.、もしくは .T、.Fなどで始まる値です。NULL データ項目は連続する 2 個のコンマで表され、これに対応する配列要素または複素数変数の値が変更されないことを示します。 NULL データ項目は、配列要素または複素数変数についてだけ使用できます。1 個の NULL データ項目が 1 個の複素定数全体を表します。複素定数の一方の部 (虚部または実部) としては使用できません。
* nam2.f 連続したコンマのある変数群入力REAL ARRAY(4,4)NAMELIST /GRID/ ARRAYWRITE ( *, * ) '入力 ?'READ ( *, GRID )WRITE ( *, GRID )END
D$GRID ARRAY = 9,9,9,9,,,,,8,8,8,8 $この結果、9 が配列
ARRAYの第 1 行にロードされ、4 個の要素を飛ばして 8 が第 3 行に読み込まれます。配列専用
書式 r*c では、定数 c を r 個複写したものが配列に格納されます。ここで、r はゼロ以外の符号なし整定数で、c は任意の定数です。
* nam3.f 変数群 "r*c" と "r* "REAL PSI(10)NAMELIST /GRID/ PSIWRITE ( *, * ) '入力 ?'READ ( *, GRID )WRITE ( *, GRID )END
D$GRID PSI = 5*980 $上記の
nam3.fプログラムでは、上記の入力を読み込み、980.0 を配列PSIの最初の 5 個の要素に読み込みます。
- 書式 r* は、配列の r 個の要素を飛ばします (つまりこれらは変更されません)。ここで、r は符号なし整定数です。
D$GRID PSI = 3* 5*980 $
nam3.fプログラムは、上記の入力では最初の 3 個の要素を飛ばし、980.0 をPSIの要素
4、5、6、7、8 に読み込みます。名前の要求
端末からの変数群入力の実行中に、使用するグループ名と変数群名を要求できます。これには、第 2 桁に疑問符 (
?) を入力し、Return キーを押します。グループ名とそのグループの変数名が表示され、次の入力を待ちます。
|
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |