COBOL言語でファイルの開閉命令はOPEN文とCLOSE文! | 用語辞典

COBOL(コボル)言語の予約語OPENとCLOSEを使ったファイル開閉処理とは

辞典・辞書-OPEN,CLOSE-イメージ

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

COBOL(コボル)言語のOPEN文とCLOSE文は、ファイルの開閉処理を行なう上で必ず使用する命令文です。
文字通りの意味をもつ、この2つの命令文はファイルを開くOPEN文と、ファイルを閉じるCLOSE文のセットで用います。

ファイルをプログラム上で扱うときは、OPEN文で必要なファイルを事前に開き、使用後はCLOSE文で閉じることが1つの流れとなります。
そこで今回は、OPEN文とCLOSE文の基本的な書き方からルールまで纏めてご説明します。

COBOL言語のOPEN文とCLOSE文-書き方と使用例

書き方1: (ファイル開閉処理)

OPEN [モード指定] [開くファイル変数]
CLOSE [閉じるファイル変数]

※OPEN文とCLOSE文は、「OPEN」~「CLOSE」の間にファイル処理(READ文やWRITE文など)を記述します。

※[モード指定]とは、INPUT(入力)用やOUTPUT(出力)用など、ファイルを開く状態を指定する部分です。

※変数とは、データ項目と同じ意味で、数値や文字などが入ったデータを、使用するために名前をつけた物です。

※[開くファイル変数]と[閉じるファイル変数]は、同一のファイル変数である必要があります。

※ファイルをOPEN文で開く場合は、事前に環境部とデータ部でファイルを指定する必要があります。

ファイルを用いた(書き込んだり、読み込んだりする)プログラムを作成する場合、「ENVIRONMENT DIVISION」(環境部)の「INPUT-OUTPUT SECTION」(入出力節)で使用するファイルを設定する必要があります。

ファイルの細かな設定は「FILE-CONTROL」(ファイル管理段落)に記述し、記述したファイル変数を「DATA DIVISION」(データ部)でも設定しなければなりません。
環境部、データ部の両方にファイルの設定を記述して、やっとファイルを使用するための準備が整います。

※読み込むファイルは事前に用意しておきましょう。
FLIE-DATA.txt————
AB
CD
EF
GH
IJ
—————————-

使用例1:
辞典・辞書-OPEN,CLOSE-使用例1

実行結果1:
辞典・辞書-OPEN,CLOSE-実行結果1

使用例1のサンプルプログラムで設定と処理の流れを見てみましょう。
まず、「FILE-CONTROL」(ファイル管理段落)で「”FLIE-DATA.txt”」というファイル名と、「FILE-DATA」というファイル変数名を関連付けています。

これとあわせて、ファイルの状態を確認するためのファイルステータス変数、「STATUS-DATA」を記述します。
これを設定しておくことで、現在のファイル処理状況を確認することができます。

もし、改行で区切られたファイルを読み込む場合は「ORGANIZATION IS LINE SEQUENTIAL」も一緒に設定しておきます。
(ファイルの定義は、SELECT [ファイル変数名] ASSIGN TO [“ファイル名”]と記述し、ファイルステータスの定義は、FILE STATUS IS [ファイルステータス変数]と記述します。 )

次に、データ部の「FILE SECTION」(ファイル節)で読み込むファイルの指定をします。
環境部で設定したファイル変数「FILE-DATA」を指定し、読み込むファイルのレコード変数を設定しておきます。

ここで、環境部で設定したファイル変数名以外を指定すると、読み込みエラーやコンパイルエラーになりますので、注意が必要です。
続いて、ファイルステータスの値が入る変数を定義します。これでファイルの設定は完了となります。
(読み込みファイルの指定は、FD [読み込むファイル変数]と記述します。)

ファイルの設定が完了しましたので、ここからファイルの実行処理になります。

まず最初に、MOVE文で「STATUS-DATA」をSPACE(空白)で初期化します。
これは、設定した変数(データ項目)が必ずしも意図した初期値(文字変数なら空白、数値変数なら0)であるとは、
限らないためです。思わぬ動作をさせないために、必ず初期化しましょう。

次に、OPEN文で先ほど設定した、「FILE-DATA」を入力モード指定で開きます。

ファイルを開いたら、PERFORM文でファイルの状態が「00」(正常に処理が実行できたことを示す値)以外になるまで、READ文で読み込み処理をさせ、「NOT AT END」でファイルが読み込める間の実行処理を、「AT END」でファイルの読み込めるデータが無くなった時の終了処理をさせています。

READ文がファイルのデータをすべて読み込むと、最後に「AT END」の処理が実行され「FILE-DATA」のファイルステータスが書き変わります。そうすることで、ファイルステータスが”00″以外となり、PERFORM文も終了します。

そして、ファイル処理がすべて完了しましたので、プログラムを終了する前にファイルをCLOSE文で閉めます。ファイルを開いたら、必ず閉めるルールがありますので、忘れずにCLOSE文で閉じておきましょう。

実行結果では、FLIE-DATA.txtのデータが正常にREAD文で読み出されています。文字列の右端にある数値2桁は、ファイルステータスです。
「00」ですから、正常に読み込み処理がされていることがわかります。

OPEN文とCLOSE文のCOBOL言語におけるルール

1.COBOL(コボル)言語のOPEN文は、ファイルを開く(準備をする)ためのものです。
ファイルへの実際の書き出しや読み込みは、WRITE文やREAD文など別の命令文を用います。

2.ファイルを使用する場合、必ずOPEN文でファイルを開く必要があります。

3.OPEN文のモード指定は、INPUT(入力用)、OUTPUT(出力用)、I-O(入出力用)、EXTEND(拡張用)などがあり、ファイルの状態や実行させる処理によって選ぶべきモードが変わってきます。

呼び出し方法などにもよりますが、順呼び出しの場合はREAD文ならINPUTまたはI-O、WRITEならOUTPUTまたはEXTENDなどが使用できます。状況によって適切なモードを選択しましょう。

4.EXTEND(拡張用)は、順呼び出し(登録された順番、大体は頭から処理される方法)の時にのみ使用可能です。

5.OPEN文でファイルを開いた場合は、CLOSE文で閉じるまで再度OPEN文を使用してはいけません。
重複でファイルを開いた場合、エラーになります。

6.OPEN文、CLOSE文は同時に複数のファイルを開くことができ、また複数のファイルを閉じることもできます。

7.CLOSE文でファイルを完全に閉じた場合、再度OPEN文でファイルを開くまで使用することはできません。

8.ファイルを開いたら、必ずプログラムを終了させる前にCLOSE文でファイルを閉じる必要があります。
もし、ファイルをCLOSE文で終了せず、そのままプログラムが終了された場合はプログラム側でCLOSE文が実行されたものとして、処理します。

COBOL言語のOPEN文とCLOSE文を使う上での注意点

「COBOL(コボル)言語における基本事項やルールについて」でも記述しましたが、OPEN文でのモード指定はルールがあります。これを守らず開いた場合はエラーが起き、場合によっては致命的なエラーになる危険性もありますので、注意が必要です。

下記に、一部の呼び出し条件の表と間違った処理の一例を記載しますので、ご覧ください。様々な状況のOPEN文のモード指定の違いを見ることができます。

順呼び出し:
辞典・辞書-OPEN,CLOSE-順呼び出しの表
乱呼び出し:
辞典・辞書-OPEN,CLOSE-乱呼び出しの表
動的呼び出し:
辞典・辞書-OPEN,CLOSE-動的呼び出しの表
注意点サンプル:
辞典・辞書-OPEN,CLOSE-注意点サンプル
実行結果:
辞典・辞書-OPEN,CLOSE-実行結果2
上記の注意点サンプルでは、OPEN文のモード指定を本来選ぶべきモードとは別のタイプで指定しています。

OPEN文の順呼び出しの場合、WRITE文はOUTPUT又はEXTENDを、READ文はINPUT又はI-Oを選択することが可能ですが、29行目と39行目の指定ではWRITE文でINPUTを、READ文でOUTPUTを開いています。

その結果、実行したプログラムは正常に処理できず、ファイルステータスに異常を示す値が返ってきています。

このように、ファイルの状態や設定、または使用するファイル処理の方法をしっかりと考えてOPEN文を使わないと、
余計なエラーを生み出すことになりますので、プログラム作成者は常にファイルの状態を把握している必要があります。

※ファイルステータスの47は、入力モードで開いていない状態で、READ文などを使用した場合にでる値です。

※ファイルステータスの48は、出力または拡張モードで開いていない状態で、WRITE文で書き込みをした場合にでる値です。

OPEN文とCLOSE文を使ったCOBOLプログラムの活用法

ファイルを用いた処理には、必須のOPEN文とCLOSE文ですが、同じファイルで読み書きしたい場合にINPUTモードで内容を読み込んで一旦閉じ、再度OUTPUTモードで開いて書き込みをする手法があります。

ですが、INPUTモードで読み込んだ内容をOUTPUTモードで開くと、その瞬間に何も内容が入っていないファイルで1度上書きしてしまうため、レコードの内容がクリアされてしまいます。

そこで、読み込んだ内容の続きから書き込みをしたい場合は、OPEN文のEXTEND(拡張用)モードで開くことにより、追記してデータを書き込むことができます。
今回は、そんなOPEN文のEXTEND(拡張用)モードを使用したサンプルをご紹介します。

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. OPEN-CLOSE-SAMPLE03.
  3.  
  4. ENVIRONMENT DIVISION.
  5. INPUT-OUTPUT SECTION.
  6. FILE-CONTROL.
  7. *ファイル名とファイル変数を関連付けて設定する
  8. SELECT TEST-FILE ASSIGN TO "FLIE-DATA.txt"
  9. *改行されたデータを読み込む場合に設定
  10. ORGANIZATION IS LINE SEQUENTIAL
  11. *ファイルのステータス変数を設定
  12. FILE STATUS IS STATUS-DATA.
  13. DATA DIVISION.
  14. FILE SECTION.
  15. *読み込み・書き込みファイルを定義
  16. FD TEST-FILE.
  17. 01 O-I-FILE-REC PIC 9.
  18. WORKING-STORAGE SECTION.
  19. *ファイルステータスと数値変数を設定
  20. 01 NUM-DATA PIC 9.
  21. 01 STATUS-DATA PIC X(2).
  22. PROCEDURE DIVISION.
  23. MAIN-PROCEDURE.
  24. *初期化処理
  25. MOVE SPACE TO STATUS-DATA.
  26. MOVE ZERO TO O-I-FILE-REC.
  27. MOVE ZERO TO NUM-DATA.
  28. *ファイルを入力用で開く
  29. OPEN INPUT TEST-FILE.
  30. *ファイルの終わり又はエラーが出るまで実行処理
  31. PERFORM UNTIL STATUS-DATA NOT= "00"
  32. *READでファイルを読み込む
  33. READ TEST-FILE
  34. NOT AT END
  35. DISPLAY
  36. O-I-FILE-REC
  37. END-READ
  38. END-PERFORM.
  39. *ファイルを閉じる
  40. CLOSE TEST-FILE.
  41. *ファイルを追記用(拡張用)で開く
  42. OPEN EXTEND TEST-FILE.
  43. *入力内容の処理分岐
  44. INPUT-PROC.
  45. *19の数値が入力されるまでの繰り返し処理
  46. PERFORM ACCEPT-PROC.
  47. IF NUM-DATA >= 1 AND NUM-DATA <=9
  48. *19の数値が入力され場合、WRITE-PROCに処理を移す
  49. GO TO WRITE-PROC
  50. ELSE
  51. *19の数値以外が入力された場合、繰り返し処理を続行する
  52. GO TO INPUT-PROC
  53. END-IF.
  54. *ファイルの書き出し関連
  55. WRITE-PROC.
  56. *ファイル出力用変数に転記する
  57. MOVE NUM-DATA TO O-I-FILE-REC.
  58. *ファイルに書き込む
  59. WRITE O-I-FILE-REC.
  60. DISPLAY O-I-FILE-REC.
  61. * ファイルをクローズする
  62. CLOSE TEST-FILE.
  63. STOP-RUN.
  64.  
  65. *コンソールからの入力受け取り関連
  66. ACCEPT-PROC.
  67. DISPLAY "1~9の数値を入力してください".
  68. *コンソールから1桁の数値データを受け取り
  69. ACCEPT NUM-DATA FROM CONSOLE.
  70. EXIT.
  71. END PROGRAM OPEN-CLOSE-SAMPLE03.

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

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

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

COBOL入門のカテゴリー

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