本文へスキップ
BecomeCoder

COBOLコース · 第7章 ファイル処理の基本 ― 順編成ファイル · レッスン37

順編成ファイルの読み込み ― OPEN INPUT / READ / AT END / CLOSE

ローカル実施

導入

前のレッスンでファイルの定義ができたので、実際に読み込む処理を書いてみましょう。ファイル処理の基本4動作のうち、「開く・読む・閉じる」の3つがこのレッスンのテーマです。

説明

       IDENTIFICATION DIVISION.
       PROGRAM-ID. READ-SALES.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT SALES-FILE ASSIGN TO "sales.dat"
               ORGANIZATION IS LINE SEQUENTIAL.

       DATA DIVISION.
       FILE SECTION.
       FD  SALES-FILE.
       01  SALES-RECORD.
           05  SALES-NAME       PIC X(10).
           05  SALES-AMOUNT     PIC 9(6)V99.

       WORKING-STORAGE SECTION.
       01  WS-EOF-FLAG          PIC X(1)   VALUE "N".

       PROCEDURE DIVISION.
           OPEN INPUT SALES-FILE.

           PERFORM UNTIL WS-EOF-FLAG = "Y"
               READ SALES-FILE
                   AT END
                       MOVE "Y" TO WS-EOF-FLAG
                   NOT AT END
                       DISPLAY SALES-NAME " : " SALES-AMOUNT
               END-READ
           END-PERFORM.

           CLOSE SALES-FILE.
           STOP RUN.
  • OPEN INPUT SALES-FILE. … ファイルを読み込み専用で開く。
  • READ SALES-FILE … ファイルから1レコード読み込み、SALES-RECORDSALES-NAMESALES-AMOUNT)に自動的に格納する。
  • AT END … 読み込もうとしたときにファイルの終わりに達していた場合の処理。COBOLのファイル読み込みは、ファイルの終わりを検知する専用の分岐がREAD文自体に組み込まれているのが特徴です。
  • NOT AT END … 正常に読み込めた場合の処理(省略も可能)。
  • END-READ … READ文の範囲の終わり。
  • CLOSE SALES-FILE. … ファイルを閉じる。開いたファイルは必ず閉じるのが鉄則です。

レッスン27で先取りして紹介した「PERFORM UNTIL WS-EOF-FLAG = "Y" でファイルを読み続ける」パターンが、まさにここで完成しました。ファイルの終わりを検知したら WS-EOF-FLAG"Y" を立て、それを条件にループを終える——これがCOBOLのファイル読み込みの定番の型です。

試すには

sales.dat というテキストファイルに次のような行を用意すれば(LINE SEQUENTIAL は各行がそのまま1レコードになります)、上のプログラムで1行ずつ読み込んで表示できます。GnuCOBOL環境かPlaygroundのファイル入力機能で試してみましょう。

TANAKA    012345.00
SUZUKI    067890.50