入力ファイルを作る
まず、プログラムと同じフォルダーにscores.txtを作ります。1行を1件のデータとして、3桁にそろえた点数を3行入れます。
070
085
092COBOLのファイル処理では、ファイルの場所、レコードの形式、読み込み終了の条件をそれぞれ定義します。入力データの行数を変えて、プログラムの結果も変わることを確認してください。
SELECTとFDでファイルを定義する
ENVIRONMENT DIVISIONのSELECTで論理ファイル名と実際のファイル名を対応させ、FILE SECTIONのFDで1レコードの項目を定義します。
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でよく使う固定長データの考え方です。
OPENとREADで1件ずつ読む
ファイルをOPEN INPUTで開き、READを繰り返します。最後まで読むとAT ENDの処理が実行されるため、終了フラグを立ててループを終わらせます。
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.読み込み: 070
読み込み: 085
読み込み: 092
件数=003 合計=00247AT ENDを忘れると、読み込み終了後の処理が不明確になります。件数を増やす処理はNOT AT ENDの中に置き、実際に読めたレコードだけを数えます。
WRITEで結果を書く
出力ファイルには、SELECT、FD、レコード定義を用意し、OPEN OUTPUTで開きます。レコードへ値を設定してからWRITEします。
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桁なので、短い文字列を入れると残りは空白になります。帳票や連携ファイルでは、項目の長さと出力仕様を先に確認します。
FILE STATUSで状態を確認する
FILE STATUSへ2桁の状態コードを受け取ると、ファイルを開けたか、読み込みや書き込みが成功したかを確認できます。まずは異常時にメッセージを出して終了する形から始めます。
OPEN INPUT SCORE-FILE
IF FILE-STATUS NOT = "00"
DISPLAY "ファイルを開けません: " FILE-STATUS
STOP RUN
END-IF.ファイル名の間違い、権限不足、入力形式の違いなどは、状態コードだけでは原因を特定できない場合があります。実行したフォルダーとファイル名も合わせて確認しましょう。
練習
sales.txtへ「商品コード 数量」のようなデータを複数行入れ、読み込み件数と数量合計を表示してください。次に、合計をsummary.txtへ書き出します。
入力ファイルが空の場合、1件も読まれない場合、ファイルが存在しない場合を試し、それぞれの結果を確認しましょう。
