COBOL2002 使用の手引 手引編


6.7.3 入出力手続き文と動作

テキスト編成ファイルに対する入出力手続き文について説明します。なお,次に説明する規則以外については,順編成ファイルの場合と同じです。

〈この項の構成〉

(1) READ文

(a) READ文でのテキスト編成ファイル固有の規則

  • 物理ファイル上にあるレコードの区切り文字(改行文字)は,COBOLプログラムのレコード領域に格納されません。

  • テキスト行がレコード長より短いときは,改行文字までの文字列が入力され,残りの部分には空白(X'20')が埋められます。改行文字はすべて切り捨てられます。

  • テキスト行がレコード長より長いときは,ファイルの開くモードによって次のように動作が異なります。

    (I-Oモード以外で開いている場合)

    レコード長で区切られた複数レコードとして入力されます。このとき,FILE STATUS句を指定していると,入出力状態には04が返されます。

    (I-Oモードで開いている場合)

    READ文はエラーとなります。このとき,FILE STATUS句を指定していると,入出力状態には30が返されます。

  • 復帰文字(X'0D')は1バイトのデータとして扱われます。

  • タブ文字(X'09')はそのままデータとして入力され,空白には置き換えられません。

  • ファイルの終わりが改行文字でないときは,ファイルの終わりに改行文字があるとみなされます。

  • レコード中にNULL(X'00')が含まれる場合,NULL(X'00')以降はデータとして入力されません。

  • ファイル定義が可変長の場合,レコード記述項の最大長分の固定長として読み込まれます。このとき,レコード長には,ファイルから実際に読み込んだ長さが設定されます。

    また,I-Oモード以外でファイルを開き,かつレコード記述項の長さが最大レコード長より短い場合,最大レコード長で確保されたレコード領域に最大レコード長で読み込まれます。このとき,DEPENDING ON指定のデータ名には,レコード記述項で定義したレコード長より大きい値が設定される場合があります。

    このため,入出力状態が00の場合は改行文字の直前までの長さが,入出力状態が04の場合は最大レコード長が,それぞれDEPENDING ON指定のデータ名に設定されます。どちらの場合でも,COBOLプログラムから参照できるのは,レコード記述項で定義した長さ分の領域だけです。

(2) WRITE文

(a) WRITE文でのテキスト編成ファイル固有の規則

  • レコード領域の最後が半角空白文字(X'20')以外のときは,改行文字を付けて出力されます。

  • レコード領域の最後が半角空白文字(X'20')のときは,末尾の半角空白文字(終端から半角空白文字以外の文字が出現するまでの部分)が切り捨てられ,改行文字を付けて出力されます。出力レコードの末尾の空白文字列を出力したい場合は,「6.7.5 レコード末尾の空白文字を出力する機能」を参照してください。

(3) REWRITE文

(a) REWRITE文でのテキスト編成ファイル固有の規則

  • REWRITE文を実行する直前の入出力文はREAD文で,このREAD文が成功していなければなりません。

  • REWRITE文は,読み込んだテキスト行の長さと更新用レコードの長さが等しい場合だけ,テキスト行が書き換えられます。それ以外の場合,REWRITE文はエラーとなり,FILE STATUS句を指定していると,入出力状態に44が返されます。なお,更新用レコードの長さとは,後続の半角空白文字を削除した長さを指します。更新するレコードの長さにレコード末尾の半角空白文字も含めたい場合は,「6.7.5 レコード末尾の空白文字を出力する機能」を参照してください。

  • REWRITE文では,テキスト行のうち改行文字,またはファイルの終わり(EOF)の直前までを書き換えます。