COBOL

ファイル入出力

テキストファイルを1行ずつ読み、集計し、結果を書き出す流れを学びます。

COBOL入門の講座一覧

01

入力ファイルを作る

まず、プログラムと同じフォルダーにscores.txtを作ります。1行を1件のデータとして、3桁にそろえた点数を3行入れます。

scores.txtTEXT
070
085
092

COBOLのファイル処理では、ファイルの場所、レコードの形式、読み込み終了の条件をそれぞれ定義します。入力データの行数を変えて、プログラムの結果も変わることを確認してください。

02

SELECTとFDでファイルを定義する

ENVIRONMENT DIVISIONのSELECTで論理ファイル名と実際のファイル名を対応させ、FILE SECTIONのFDで1レコードの項目を定義します。

ファイルの定義COBOL
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT SCORE-FILE ASSIGN TO "scores.txt"
        ORGANIZATION IS LINE SEQUENTIAL
        FILE STATUS IS FILE-STATUS.

DATA DIVISION.
FILE SECTION.
FD SCORE-FILE.
01 SCORE-RECORD PIC 9(3).

LINE SEQUENTIALは、行単位のテキストファイルを扱うための指定です。固定長のレコードファイルや処理系固有のファイル形式とは違うため、入力データの形式とORGANIZATIONを合わせます。

PIC 9(3)と定義したレコードは、入力側も固定長の3桁にそろえます。70ではなく070と書くのは、COBOLでよく使う固定長データの考え方です。

03

OPENとREADで1件ずつ読む

ファイルをOPEN INPUTで開き、READを繰り返します。最後まで読むとAT ENDの処理が実行されるため、終了フラグを立ててループを終わらせます。

点数を合計するCOBOL
WORKING-STORAGE SECTION.
01 FILE-STATUS PIC XX.
01 EOF-FLAG PIC X VALUE "N".
01 TOTAL PIC 9(5) VALUE 0.
01 RECORD-COUNT PIC 9(3) VALUE 0.

PROCEDURE DIVISION.
    OPEN INPUT SCORE-FILE
    PERFORM UNTIL EOF-FLAG = "Y"
        READ SCORE-FILE
            AT END MOVE "Y" TO EOF-FLAG
            NOT AT END
                ADD SCORE-RECORD TO TOTAL
                ADD 1 TO RECORD-COUNT
                DISPLAY "読み込み: " SCORE-RECORD
        END-READ
    END-PERFORM
    CLOSE SCORE-FILE
    DISPLAY "件数=" RECORD-COUNT " 合計=" TOTAL
    STOP RUN.
実行結果OUTPUT
読み込み: 070
読み込み: 085
読み込み: 092
件数=003 合計=00247

AT ENDを忘れると、読み込み終了後の処理が不明確になります。件数を増やす処理はNOT AT ENDの中に置き、実際に読めたレコードだけを数えます。

04

WRITEで結果を書く

出力ファイルには、SELECT、FD、レコード定義を用意し、OPEN OUTPUTで開きます。レコードへ値を設定してからWRITEします。

集計結果を出力するCOBOL
SELECT RESULT-FILE ASSIGN TO "result.txt"
    ORGANIZATION IS LINE SEQUENTIAL.
FD RESULT-FILE.
01 RESULT-RECORD PIC X(30).

MOVE "SCORE TOTAL: 247" TO RESULT-RECORD.
WRITE RESULT-RECORD.

出力レコードの桁数が30桁なので、短い文字列を入れると残りは空白になります。帳票や連携ファイルでは、項目の長さと出力仕様を先に確認します。

05

FILE STATUSで状態を確認する

FILE STATUSへ2桁の状態コードを受け取ると、ファイルを開けたか、読み込みや書き込みが成功したかを確認できます。まずは異常時にメッセージを出して終了する形から始めます。

オープン結果を確認するCOBOL
OPEN INPUT SCORE-FILE
IF FILE-STATUS NOT = "00"
    DISPLAY "ファイルを開けません: " FILE-STATUS
    STOP RUN
END-IF.

ファイル名の間違い、権限不足、入力形式の違いなどは、状態コードだけでは原因を特定できない場合があります。実行したフォルダーとファイル名も合わせて確認しましょう。

06

練習

sales.txtへ「商品コード 数量」のようなデータを複数行入れ、読み込み件数と数量合計を表示してください。次に、合計をsummary.txtへ書き出します。

入力ファイルが空の場合、1件も読まれない場合、ファイルが存在しない場合を試し、それぞれの結果を確認しましょう。