導入
前のレッスンでファイルの定義ができたので、実際に読み込む処理を書いてみましょう。ファイル処理の基本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-RECORD(SALES-NAME・SALES-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