導入:なぜENDFILE処理が重要なのか?
メインフレームでのバッチ処理において、ファイルからデータを1行ずつ読み込む作業は日常茶飯事です。しかし、ファイルの終わり(EOF:End of File)に到達したとき、プログラムが適切に反応できないと、システムは異常終了してしまいます。PL/Iにおける「ENDFILE条件」は、この「ファイルの終わり」をスマートに検知し、安全に処理を終了させるための非常に重要な仕組みです。
基礎知識:ENDFILE条件とは?
PL/Iには「ON-Units(オンユニット)」という、特定のイベントが発生した時に自動的に呼び出される例外処理の仕組みがあります。ENDFILE条件は、順次ファイル(Sequential File)の読み込み中に、これ以上読み込むレコードがない状態になったときに発生する「イベント」です。
現代のプログラミング言語(JavaやPythonなど)では、読み込み結果として「null」や「-1」が返ることを確認してループを抜けるのが一般的ですが、PL/Iは「ファイルが終わったらこの処理を実行せよ」というイベント駆動型の記述をするのが特徴です。
実装:ENDFILEの制御フロー
具体的には、ON文を使って「ENDFILEが発生した時のフラグ」を定義し、読み込みループの中でそのフラグを監視します。
1. ON ENDFILE文で、ファイル終了時にフラグを立てるよう設定します。
2. DO WHILEループの中で、読み込みを続けます。
3. フラグが立ったらループを終了します。
サンプルプログラム:安全なファイル読み込み
以下のコードは、MYFILEというファイルを読み込み、終了時にループを脱出する基本的な構成です。
/ ファイル処理のサンプルプログラム /
TEST_PROG: PROC OPTIONS(MAIN);
/ ファイル定義 /
DCL MYFILE FILE RECORD INPUT;
DCL EOF_FLG BIT(1) INIT('0'B); / 終了フラグ(初期値はオフ) /
DCL RECORD_DATA CHAR(80); / 読み込み用バッファ /
/ 1. ENDFILE条件が発生した時の処理を定義 /
ON ENDFILE(MYFILE) EOF_FLG = '1'B;
/ ファイルを開く /
OPEN FILE(MYFILE);
/ 2. ループ処理:EOF_FLGが'1'Bになるまで繰り返す /
DO WHILE (EOF_FLG = '0'B);
READ FILE(MYFILE) INTO(RECORD_DATA);
/ ファイルが終わっていない場合のみ処理を実行 /
IF EOF_FLG = '0'B THEN
PUT SKIP LIST('読み込んだデータ: ' || RECORD_DATA);
END;
/ 後処理 /
CLOSE FILE(MYFILE);
PUT SKIP LIST('処理が正常に終了しました。');
END TEST_PROG;
応用・注意点:現場で役立つヒント
現場でPL/Iの保守をしていると、古いコードで「ON ENDFILEの中で無理やりGO TO文を使ってループを脱出する」という書き方を見かけるかもしれません。しかし、これはプログラムの可読性を著しく下げるため、フラグ(BIT変数)を用いる方法を強く推奨します。
また、もしJavaなどの現代言語へ移行する際は、PL/Iの「ON文(イベント駆動)」から、「while(scanner.hasNext())」のような「ループ開始前の判定(構造化プログラミング)」へ書き換える必要があります。このロジックの変換が、移行プロジェクトで最もよくある躓きポイントですので、現在のPL/Iコードの構造をしっかり把握しておくことが大切です。

コメント