COBOLのEOF検出とループ制御|初心者でもわかるファイル終端処理
生徒
「COBOLでファイルの終わり(EOF)をどうやって知るんですか?」
先生
「COBOLでは、END-OF-FILEやAT ENDという構文で、ファイル終端(EOF)を検出できます。」
生徒
「終わりを検出して、どうやってループを止めればいいですか?」
先生
「ループ制御を使えば、ファイルを最後まで順番に読み込んで処理できます。初心者の方にもわかりやすく説明しますね。」
1. EOF(END‑OF‑FILE)って何?
EOF(エンドオブファイル)とはファイルの終わりを指す言葉です。COBOLでは、「もうこれ以上読むデータがありません」という合図のように使われます。プログラミング初心者向けに例えるなら、ファイルは「本」で、EOFは「本の最終ページを超えたあと」という感じです。
キーワード:EOF検出、END-OF-FILE、ループ制御、ファイル読み込み、プログラミング初心者。
2. EOF検出の基本構文
ファイルをREADして、AT ENDやEND-OF-FILEを使えば、終わりを検出できます。
READ input-file
AT END MOVE "YES" TO EOF-FLAG
END-READ
解説:
・READはファイルから1行読み込む命令。
・AT ENDは「読み込めなかったとき」、つまりEOFに達したときに処理をします。
・EOF-FLAGは終わりを知らせる変数です。
3. ループ制御とEOFの組み合わせ
EOF検出とループを組み合わせることで、「ファイルの先頭から順番に読み込む」処理ができます。
MOVE "NO" TO EOF-FLAG.
PERFORM UNTIL EOF-FLAG = "YES"
READ input-file
AT END MOVE "YES" TO EOF-FLAG
NOT AT END
DISPLAY 見出し: データ内容
END-READ
END-PERFORM
ポイント:
・PERFORM UNTILで「終わるまで繰り返す」条件付きループ。
・EOFまで処理を続けるので、抜け漏れなくファイル全体を読むことができます。
4. FILE STATUSとEOF判定の違い
EOF検出にはAT ENDだけでなく、FILE STATUSでも判定できます。次のコードはFILE STATUSを使ったEOF判定です。
READ input-file
IF WS-FS = "02"
DISPLAY "ファイル終端に達しました"
END-IF
ここでは、FILE STATUSの"02"というコードがEOFを意味します。
5. EOF検出を応用したファイル処理例
実際には、読み取ったデータを別ファイルに書き込む時にもEOFループを使います。例を見てみましょう。
MOVE "NO" TO EOF-FLAG.
PERFORM UNTIL EOF-FLAG = "YES"
READ input-file
AT END MOVE "YES" TO EOF-FLAG
NOT AT END
WRITE output-rec FROM input-rec
END-READ
END-PERFORM
EOFまで読み込み→書き込み処理を繰り返すことで、入力ファイルを丸ごとコピーできます。
6. EOF検出時のエラー対策も大切
EOF以外のエラーが起きた時は、INVALID KEYやFILE STATUSのコードを使って対策します。たとえば、ファイル読めない時にメッセージ表示や停止させる処理が必要です。
READ input-file
AT END MOVE "YES" TO EOF-FLAG
INVALID KEY DISPLAY "読み込みエラー発生"
END-READ
ループ処理の中でエラー対策を入れておくと、安心してファイル全体処理ができます。
7. 初心者におすすめ簡単例え
EOF検出とループ制御は「読書」に似ています。本を1ページずつ読んでいって、最後のページを超えたら読み終わり、それと同じ流れです。
また「旗」=EOF-FLAGは「読み終わりのしるし」のようなもので、ループを止める目印になります。
8. 大事なポイント
- EOF検出は
AT ENDやFILE STATUSでできる - ループ制御(
PERFORM UNTIL)を使えばファイル全体を順番に処理できる - エラーも一緒に見ておくと安心、安全なプログラムになる
COBOLでファイル処理を行う場合、「どこまでデータがあるのか」を判断する仕組みがとても大切です。
AT ENDやFILE STATUSを使えば、ファイルの終わり(EOF)を明確に検出できるので、
必要な分だけを確実に処理することができます。
また、PERFORM UNTILによるループ処理を活用することで、ファイルの先頭から終端までを
順番に読み進めることができます。処理の順番を守るという点でも非常に役立つ構文です。
初心者の方には、次のような「EOFまで繰り返す基本形」を覚えておくと安心です。
MOVE "NO" TO EOF-FLAG.
PERFORM UNTIL EOF-FLAG = "YES"
READ INPUT-FILE
AT END
MOVE "YES" TO EOF-FLAG
NOT AT END
DISPLAY "読み取り結果:" INPUT-REC
END-READ
END-PERFORM
このサンプルでは、EOF-FLAGという変数を使って、ファイルの終わりを検出しています。 もしファイルの中に3件しかデータがなければ、3回だけ処理されて止まる仕組みです。 無限ループになることも防げるため、初心者にもおすすめです。
ファイル読み込みとEOF判定は、COBOLプログラムの基本中の基本です。 ここをしっかり理解することで、ファイル処理全体がスムーズになります。 小さなサンプルを動かしながら、手を動かして学んでいくことが大切です。
まとめ
ファイルの終端を検出しながらループ制御を行う仕組みは、COBOLの中でも特によく使われる大切な考え方です。実際の業務では、売上データを読み込んだり、社員情報を処理したり、さまざまな場面でファイルを一行ずつ扱うことがあります。そのとき、終わりがどこなのか判断できなければ、延々と読み続けてしまったり、意図しないエラーが発生したりします。だからこそ、AT ENDやFILE STATUSを使って終端を確認し、不要な処理を止めることが重要になります。とても地味に見える仕組みですが、安心して動作するプログラムを作るためには欠かせない考え方です。
初心者がつまずきやすいのは、「EOFを検出したあとに何をするのか」という流れです。フラグを立ててループを終わらせる方法、状態コードで判定する方法、どちらも仕組みは同じで「読み終わりを判断できるかどうか」という点がポイントになります。もし大きなファイルを扱っていたり、複数のファイルを連続で処理していたりしても、ループとEOFさえ正しく扱えれば最後まで安全に読み切ることができます。この考え方を覚えておくと、COBOLのファイル処理が一気に分かりやすくなるでしょう。
よくある処理の流れをもう一度
ファイルを開いて、読み込んで、EOFならループ終了。それだけのことですが、処理が増えるほど複雑に見えることがあります。そんなときは、まず一番基本の形を思い出すと整理しやすくなります。ここでは、読み込んだ内容を画面に表示しながら最後まで処理する例として、わかりやすい形にまとめてみます。
MOVE "NO" TO EOF-FLAG.
PERFORM UNTIL EOF-FLAG = "YES"
READ INPUT-FILE
AT END
MOVE "YES" TO EOF-FLAG
NOT AT END
DISPLAY "読み取りデータ:" INPUT-REC
END-READ
END-PERFORM
この形はシンプルですが、実務の現場でもよく使われます。フラグを使う方法はとても読みやすく、他の人がプログラムを読んでも意図が理解しやすくなります。また、ファイルに不正なデータが混ざっていても、エラー判定を追加することで安全に処理できます。少しずつ改良しながら信頼できるプログラムにするというのが、COBOLらしい書き方でもあります。
FILE STATUSを使う場面
フラグではなく、状態コードで管理する方法もあります。たとえば、読み終わりのときは"02"、読み込み失敗なら"30"など、決まった番号が返ってきます。ファイルの種類や環境によっては、明確にコードで管理したい場面もあります。次の例は状態コードでEOFを判断する形です。
READ INPUT-FILE
IF WS-FS = "02"
DISPLAY "おわりまで読みました"
END-IF
状態コードを使うと、異常終了なのか単に読み終わっただけなのかを区別できるため、エラー対策が柔らかく書けるという利点があります。大きなシステムでは、思わぬ入力エラーに備えることが多く、状態コードで細かく判断することも一般的です。
読みながら別ファイルに書き込む流れ
EOFの仕組みが理解できれば、次は「読みながら書く」という応用ができるようになります。入力を読み、終わりまで処理を続けながら、別のファイルへ整形して書き出すことが可能です。現場ではとてもよくある処理で、帳票作成やログ生成などさまざまな場面で役に立ちます。
MOVE "NO" TO EOF-FLAG.
PERFORM UNTIL EOF-FLAG = "YES"
READ INPUT-FILE
AT END
MOVE "YES" TO EOF-FLAG
NOT AT END
WRITE OUTPUT-REC FROM INPUT-REC
END-READ
END-PERFORM
もし途中でエラーが起きても、INVALID KEYやFILE STATUSを使えば異常を確認できます。読み込みだけでなく書き込みにも注意を向けるようになると、さらに一歩先のファイル処理が身につきます。
初心者が気をつけたい小さなポイント
ファイルを読み込むとき、忘れてはいけないことがいくつかあります。例えば、OPEN INPUT、CLOSEの書き忘れ、フラグの初期化忘れ、レコード定義の桁ずれなどです。どれも些細なことですが、うっかり抜けると望んだ動きになりません。特に、フラグを初期化しないままループに入ると、永遠に処理が止まらないことさえあります。こうした細かい注意が、ファイル処理の安定につながります。
終端を正しく扱えるようになると、COBOLでのファイル処理が一気に実用的になります。扱えるファイルの種類や規模も広がり、他の処理と組み合わせることでより複雑な仕組みを作ることも可能になります。
生徒
「EOFって難しそうだと思っていたけど、読み終わったら旗を立てるって考えれば理解しやすいですね!」
先生
「その感覚はとても大事ですよ。読み終わったことを知らせる仕組みさえ作れれば、ループ制御は自然とうまくいきます。」
生徒
「PERFORM UNTILと組み合わせると、ファイルを全部読めるのが便利ですね。書き込みと合わせても使えました。」
先生
「そうです。次はエラー処理も少しずつ練習してみると、もっと堅実なプログラムになりますよ。」
生徒
「これで大きなデータも扱えそうです!最初は怖かったけど、やってみると整理できました。」
先生
「着実に理解できていますね。EOFの検出はCOBOLの基本のひとつなので、しっかり身につけておくと役に立ちますよ。」