なぜ、いまさらREAD文の「範囲」を指定する必要があるのか?
COBOLを学び始めたばかりの皆さんが、最初につまずきやすいポイントの一つが「ピリオド(.)」の扱いです。昔のCOBOLでは、READ文の終了をピリオドで示していましたが、これが複雑なプログラムになると「どこまでがREADの処理なのか」を曖昧にし、意図しない場所で処理が終了してしまうバグの原因となってきました。
そこで登場したのが、範囲終了を示す「END-READ」です。これを使うことで、ファイル読み込みの処理範囲を明確にし、プログラムの可読性と安全性を劇的に向上させることができます。
基礎知識:構造化制御構文とは
COBOLにおいて「構造化制御構文」とは、IFやREADといった命令に対して、その処理が「どこで始まり、どこで終わるか」を明示的に囲む書き方のことです。
かつてはピリオドがその役割を担っていましたが、現在はEND-XXXX(END-IF, END-READ, END-PERFORMなど)を使うのが現代COBOLの基本ルールです。これにより、プログラムの流れが視覚的にわかりやすくなり、メンテナンスが非常に楽になります。
実装:READ文に「END-READ」を組み込む
READ文を使う際は、単にレコードを読み込むだけでなく、ファイルが終了したとき(AT END)の処理をセットで書くのが一般的です。END-READを使うと、このAT ENDの処理ブロックを「END-READまで」と明確に区切ることができます。これにより、IF文の中にREAD文を入れ子にするような複雑な構造でも、誤動作を防ぐことが可能になります。
サンプルプログラム:安全なファイル読み込み
以下のコードは、入力ファイルを一行ずつ読み込み、終了判定を正しく行うための実用的な例です。そのままコピーして活用してください。
PROCEDURE DIVISION.
MAIN-LOGIC.
OPEN INPUT IN-FILE.
- ファイルの終端に達するまでループする
- ファイルが終わった時の処理
- 正常に読み込めた時の処理
応用・注意点:現場で役立つポイント
現場でコードを書く際、特に注意してほしいのは「ピリオドの打ちすぎ」です。
1. ピリオドは段落の最後だけ:END-READなどの範囲指定を使う場合、その直後にピリオドを打つのは、基本的に「段落(PARAGRAPH)の最後」か「プログラムの終了時」だけにしましょう。
2. ネストの意識:END-READを書き忘れると、コンパイラが「どこまでがREADの範囲か」を誤解し、コンパイルエラーや予期せぬ挙動を引き起こします。慣れないうちは、コードを書いた後に「END-READに対応するREADがどこにあるか」を目で追う癖をつけましょう。
この「構造化」を意識するだけで、あなたの書くCOBOLコードの品質は格段に上がります。ぜひ今日から積極的にEND-READを取り入れてみてください。

コメント