COBOL言語で入力ファイルを読み込むには「READ文」で! | 用語辞典

COBOL(コボル)言語の予約語READを使った命令文の書き方とは

辞典・辞書-READ-イメージ

COBOL(コボル)言語のREAD文とは?

COBOL(コボル)におけるREAD文は、入力ファイルを読み込むときに使用する命令文です。ファイルを読み込むときは他のプログラミング言語同様に、事前に読み込むファイルを指定したり、読み込むファイルをオープンしておく必要があります。

本記事では、READ文の基本的な使い方やルール、注意点などをご紹介します。

書き方1-1:(入出力に関するセクションを指定する)
ファイルを読み込む準備作業として、事前にファイルの情報を設定しておく必要があります。
「ENVIRONMENT DIVISION」に以下を記述します。

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT [ファイル変数] ASSIGN TO ['ファイル名']
ORGANIZATION IS LINE SEQUENTIAL.
STATUS [ファイル管理用変数].

まず、「INPUT-OUTPUT SECTION」でファイル入出力のセクションを指定し、ファイルの情報を設定するために「FILE-CONTROL」を記述します。

次にSELECT文で、ファイルの読み込み時に指定するファイル変数を定義して、ASSIGN TOの後にファイル名を指定します。
「ORGANIZATION IS LINE SEQUENTIAL.」は、改行区切りで読み込む場合に指定します。

最後にファイルのステータスを管理するファイル管理用の変数を定義します。

書き方1-2:(ファイルに関するセクションを指定する)
実際に読み込むファイルと、読み込み時に使用するレコードを設定します。
「DATA DIVISION」に以下を記述します。

FILE SECTION.
FD [ファイル変数].
[ファイルレコード変数].

読み込むファイルを指定するために「FILE SECTION」を記述し、FD(ファイルディスクリプション)にSELECT文で指定したファイル変数を指定します。

次に読み込むファイルレコード用の変数を定義しておきます。

書き方1-3:(読み込み処理)
「MAIN SECTION」で実際にファイルを読み込む処理を記述します。

OPEN INPUT [ファイル変数].
READ [ファイル変数]
    AT END
 読み込み終了時の処理
 NOT AT END
 読み込み実行時の処理
END-READ.
CLOSE [ファイル変数].

まず「OPEN INPUT」でファイル変数を指定して、ファイルをオープンします。

次にREAD文でファイル名の変数を指定し、AT ENDはファイル読み込み終了時の処理を、NOT AT ENDは読み込み実行時の処理を記述します。
ファイルの読み込みが完了したら、必ずCLOSE文でファイルを指定して、ファイルを閉じます。

書き方1-1~1-3を踏まえて、実際にファイルに読み込む処理の簡単なサンプルを、以下に紹介します。
読み込み用のファイルは事前に用意しておきます。

test.txt-------------------
ABCD
EFGH
IJKL
----------------------------

使用例:
辞典・辞書-READ-使用例:

実行結果:
辞典・辞書-READ-実行結果:

紹介したサンプルでは、読み込み用ファイルtest.txtを指定し、PERFORM文を使用してファイル読み込み時のステータスが"00"(正常)な限り、ループしてREAD文で読み込んでいます。
AT ENDで読み込み終了時に"READ END"を出力し、NOT AT ENDで改行ごとに読み込んだ内容を出力しています。

READ文のCOBOL(コボル)言語における基本事項やルールについて

  1. READ文で読み込むレコードはデータ部で定義しておく必要があります。
  2. READ、ファイル名、AT END、NOT AT ENDの各要素間の空白、改行の有無は自由です。
  3. AT ENDと読み込み終了処理、NOT AT ENDと読み込み実行時の処理は必要に応じて記述し、片方または両方を省略しても問題ありません。

COBOL(コボル)言語のREAD文を扱う上での注意点

COBOLにおけるファイル入出力は、前述したようにREAD文で読み込む前に、さまざまな準備が必要です。

また、他のCやJavaなどのプログラミング言語と異なる点として、ファイルを1行ずつ読み込むと、いずれは読み込むレコードがなくなりますが、COBOLにはファイル読み込み時の状態を返すステータスや関数は存在しません。

そのため、ファイルの読み込み有無は、プログラム側で管理する必要があります。

例えば、READ文で取得したレコードをデータ項目に転記する場合、取得したレコードが空の場合でも、プログラムでファイル読み込み有無が判断できなかったら、そのまま処理が実行されてしまいます。

以下にREAD文でファイルを読み込んで、読み込んだ最後のレコードをデータ項目に転記する処理を紹介します。

辞典・辞書-READ-処理例
サンプルではファイル読み込み後に、読み込んだ最後のレコードをデータ項目に転記していますが、もしファイルが存在しなかった場合、空白が転記されてしまいます。

そのため、事前にファイル入出力の結果を判定して、結果に応じた処理を記述する必要があります。

READ文を使ったCOBOL(コボル)プログラムの活用法

ファイルを読み込むときに必須のREAD文ですが、前述したようにファイルをただ読み込んで処理をするのではなく、ファイル入出力の結果に応じた処理をする必要があります。

以下にREAD文の活用法として、IF文でファイルの読み込みに成功したときと、失敗したときで動作が異なる処理を簡単なサンプルで紹介します。

   
  1. *> READ_SAMPLE03
  2. IDENTIFICATION DIVISION.
  3. PROGRAM-ID. READ_SAMPLE03.
  4.  
  5. ENVIRONMENT DIVISION.
  6. *>入出力に関するセクション
  7. INPUT-OUTPUT SECTION.
  8. FILE-CONTROL.
  9. *>SELECT文でファイル定数とASSIGN TOでファイル名を設定する
  10. SELECT TEST-FILE ASSIGN TO 'test.txt'
  11. *>改行区切りで読み込む場合は以下を設定する
  12. ORGANIZATION IS LINE SEQUENTIAL
  13. *>ステータスを管理する変数を定義する
  14. STATUS IN-FILE-STATUS.
  15. DATA DIVISION.
  16. FILE SECTION.
  17. *>FDで読み込むファイルを指定する
  18. FD TEST-FILE.
  19. 01 IN-FILE-REC PIC X(20).
  20. WORKING-STORAGE SECTION.
  21. *>ステータスの領域を設定する
  22. 01 IN-FILE-STATUS PIC XX.
  23. PROCEDURE DIVISION.
  24. MAIN SECTION.
  25.  
  26. *>ファイルをINPUT用にオープンする
  27. OPEN INPUT TEST-FILE.
  28.  
  29. *>ファイルの読み込み有無確認
  30. IF IN-FILE-STATUS NOT = "00" THEN
  31. *>読み込み失敗
  32. DISPLAY "File not found"
  33.  
  34. ELSE
  35. *>ステータスが"00"な限りループする
  36. PERFORM UNTIL IN-FILE-STATUS NOT = "00"
  37.  
  38. *>ファイルを読み込む
  39. READ TEST-FILE
  40. *>読み込み終了時
  41. AT END
  42. DISPLAY "READ END"
  43. *>読み込み実行時
  44. NOT AT END
  45. DISPLAY IN-FILE-REC
  46. END-READ
  47. END-PERFORM
  48. END-IF.
  49.  
  50. *>ファイルをクローズする
  51. CLOSE TEST-FILE.
  52.  
  53. STOP RUN.

紹介したサンプルでは、IF文でファイル読み込み有無の判定を行い、ファイルステータス変数の値が"00"以外の場合はファイル読み込み失敗とみなし、メッセージを出力して処理を終了しています。
ファイルステータス変数の値が"00"の場合はELSEの処理に入り、通常のファイル読み込み処理を実行しています。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門