COBOLファイル操作の入口!OPEN文とCLOSE文の基本を徹底解説

2025年4月10日木曜日

COBOL

基本的な計算や表示はできるようになったけど、ファイルの扱い方がイマイチわからない…特に「OPEN」とか「CLOSE」って、なんで必要なの?と感じている方もいるかもしれませんね。

大丈夫です! ファイル操作はCOBOLでデータを扱う上でめちゃくちゃ使うテクニックですが、基本さえ押さえれば怖くありません。

プログラムでファイルを安全に使うための「お作法」みたいなものなんです。

この記事では、COBOL初心者さんがつまずきやすいファイル操作の第一歩、OPEN文とCLOSE文について、基本からしっかり解説していきます。


この記事を読むと、こんなことができるようになります。

  • ファイルを開くOPEN文、閉じるCLOSE文の役割がわかる
  • OPEN文の4つのモード(INPUT, OUTPUT, I-O, EXTEND)の違いと使い分けがわかる
  • OPEN文とCLOSE文の基本的な書き方がわかる
  • 簡単なファイル読み書きプログラムの流れがつかめる
  • ファイル操作で気をつけたいポイントがわかる

COBOLにおけるファイル操作とOPEN/CLOSE文の重要性

そもそも、なんでプログラムでファイルを操作する必要があるんでしょうか?

それは、大量のデータを扱ったり、処理結果を保存しておいたり、別のプログラムにデータを渡したりするためです。

例えば、顧客リスト、商品マスター、売上データなんかがファイルとして保存されているイメージですね。

そして、プログラムがファイルを使う前には「これからこのファイルを使いますよー!」という宣言が必要になります。それが「OPEN文」の役割です。

ちょうど、お店に入る前にはドアを開けますよね? それと同じ感覚です。
コンピュータに「このファイルを使えるように準備してね」とお願いするわけです。

逆に、使い終わったファイルは「もう使い終わりましたー!」と後片付けをする必要があります。それが「CLOSE文」です。

お店を出るときにドアを閉めるのと同じですね。

これをやらないと、書き込んだデータがちゃんと保存されなかったり、ファイルが壊れたりする可能性もあるので、とっても大事な処理なんです。

OPENしたら、必ずCLOSEする。これはセットで覚えてくださいね!

ファイル「OPEN文」の基本

では、ファイルを開くための「OPEN文」について、もう少し詳しく見ていきましょう。

OPEN文は、プログラムがファイルにアクセスできるように準備する命令です。
「どのファイルを」「どんな目的で」開くのかを指定します。

ファイルを開く4つのモード (INPUT, OUTPUT, I-O, EXTEND)

OPEN文で特に大事なのが、「どんな目的で」開くのかを指定する「モード」です。
主に4つのモードがあります。目的によって使い分けるんですよ。

  • INPUTモード
    ファイルを「読み込む」専用で開きます。ファイルに何かを書き込むことはできません。既存のファイルの内容を読み取りたいときに使います。お店の商品を見るだけ、みたいな感じですね。
  • OUTPUTモード
    ファイルを「新規作成して書き込む」ために開きます。もし同じ名前のファイルがすでにあっても、その内容は消えて新しいファイルとして上書きされるので注意! 真っさらなノートに書き始めるイメージです。
  • I-Oモード (Input-Output)
    ファイルを「読み込みも書き込みも両方」できるように開きます。既存のファイルの内容を読み取って、その内容を更新(書き換え)したい場合などに使います。ノートに書いてあることを読んで、さらに書き足したり消したりする感じです。
  • EXTENDモード
    ファイルを「既存の内容の末尾に追加書き込み」するために開きます。ファイルがなければ新規作成されます。OUTPUTモードと違って、既存の内容は消えません。ノートの最後のページから続きを書き足していくイメージです。

どのモードを使うかは、プログラムでやりたいこと次第!
最初は「読むだけならINPUT」「新しく書き込むならOUTPUT」をよく使うと思います。

OPEN文の基本的な書き方 (構文)

OPEN文の基本的な書き方は、こんな感じです。

OPEN モード ファイル名.
「モード」の部分には、さっき説明した INPUT, OUTPUT, I-O, EXTEND のどれかを書きます。
「ファイル名」の部分には、プログラムの前のほう(DATA DIVISIONのFILE SECTIONにあるFD句)で定義したファイルの名前(プログラム上の名前)を書きます。

具体的には、こんなふうに書きます。
* 読み込み用に開く場合
OPEN INPUT KOKYAKU-MASTER.

* 新規書き込み用に開く場合
OPEN OUTPUT URIAGE-DATA.

* 読み書き両用に開く場合
OPEN I-O ZAIKO-FILE.

* 追加書き込み用に開く場合
OPEN EXTEND LOG-FILE.
ピリオド(.)を忘れないようにしてくださいね。
FD句で定義したファイル名と、OPEN文で指定するファイル名を一致させるのがポイントです。

ファイル「CLOSE文」の基本

ファイルを開いたら(OPENしたら)、使い終わった後に必ず閉じなければいけません。
そのための命令が「CLOSE文」です。

なぜ閉じるのがそんなに大事かというと…

  • 書き込んだ内容を確実にファイルに反映させるため。(特にOUTPUTやEXTENDモードの場合)
  • 他のプログラムや人がそのファイルを使えるようにするため。(開けっ放しだとロックがかかることがある)
  • プログラムが使うメモリなどの資源を解放するため。

お店を閉めるときに、レジを締めたり、電気を消したり、鍵をかけたりしますよね。
CLOSE文は、それに似た「後始末」の役割を持っているんです。

OPENとCLOSEは必ずペアで使う! と覚えておきましょう。

CLOSE文の基本的な書き方 (構文)

CLOSE文の書き方はとってもシンプル!

CLOSE ファイル名.
OPEN文で指定したのと同じファイル名を書くだけです。
例えば、こんな感じ。
CLOSE KOKYAKU-MASTER.
簡単ですよね!

もし複数のファイルを一度に閉じたい場合は、カンマ(,)で区切って書くこともできます。
CLOSE KOKYAKU-MASTER, URIAGE-DATA.
使い終わったファイルは、忘れずにCLOSEする習慣をつけましょう。

ファイル「OPEN文/CLOSE文」の使い方

さて、理屈がわかったところで、実際にOPEN文とCLOSE文を使った簡単なプログラムを見てみましょう。

ここでは、ファイル操作の全体的な流れをつかむことを目標にします。細かい読み書きの命令(READ文やWRITE文)は、また別の機会に詳しく見ていきましょうね。

サンプル①: 新規ファイルへの書き込み (OPEN OUTPUT / CLOSE)

まずは、新しいファイルを作成して、そこに簡単なメッセージを書き込んで閉じるプログラムです。
OUTPUTモードでファイルを開き、WRITE文で書き込み、最後にCLOSEします。

どんなファイルができるか想像しながら見てみてください。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-OUTPUT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT SYAIN-FILE ASSIGN TO 'SYAIN.TXT'.

DATA DIVISION.
FILE SECTION.
FD SYAIN-FILE.
01 SYAIN-REC.
   02 SYAIN-ID    PIC X(4).
   02 SYAIN-NAME  PIC X(20).

WORKING-STORAGE SECTION.

PROCEDURE DIVISION.
MAIN-PROC.
    OPEN OUTPUT SYAIN-FILE.

    MOVE "0001" TO SYAIN-ID.
    MOVE "テスト タロウ" TO SYAIN-NAME.

    WRITE SYAIN-REC.
    CLOSE SYAIN-FILE.
    STOP RUN.

<解説>
このプログラムを実行すると、まず `OPEN OUTPUT SYAIN-FILE.` で 'SYAIN.TXT' という名前の新しいファイルが(もしなければ)作られます。もし既に存在していたら、中身は空っぽになります。

次に `MOVE` 命令で SYAIN-REC というレコードにデータをセットし、`WRITE SYAIN-REC.` でそのレコードがファイルに書き込まれます。

最後に `CLOSE SYAIN-FILE.` でファイルが閉じられ、書き込んだ内容が確定します。

実行後、プログラムを実行した場所(カレントディレクトリなど)に 'SYAIN.TXT' というファイルができているはずです。

中身を開くと、たぶんこんな感じになっているでしょう。

0001テスト タロウ

ファイルがちゃんと作られて、データが書き込まれているのが確認できれば成功です!

サンプル②: 既存ファイルの読み込み (OPEN INPUT / CLOSE)

次に、さっき作った 'SYAIN.TXT' ファイルを読み込んで、その内容を画面に表示するプログラムです。

今度はINPUTモードでファイルを開き、READ文で読み込み、最後にCLOSEします。

どんなふうにファイルの内容が表示されるか見てみましょう。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-INPUT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT SYAIN-FILE ASSIGN TO 'SYAIN.TXT'.

DATA DIVISION.
FILE SECTION.

FD SYAIN-FILE.
01 SYAIN-REC.
   02 SYAIN-ID    PIC X(4).
   02 SYAIN-NAME  PIC X(20).

WORKING-STORAGE SECTION.

01 WS-EOF-FLAG   PIC X(1) VALUE '0'.
   88 EOF         VALUE '1'.

PROCEDURE DIVISION.
MAIN-PROC.
    OPEN INPUT SYAIN-FILE.

    READ SYAIN-FILE
        AT END SET EOF TO TRUE
    END-READ.

    PERFORM UNTIL EOF
        DISPLAY "社員ID  : " SYAIN-ID
        DISPLAY "社員名  : " SYAIN-NAME
        DISPLAY "--------------------"

        READ SYAIN-FILE
            AT END SET EOF TO TRUE
        END-READ
    END-PERFORM.

    CLOSE SYAIN-FILE.
    STOP RUN.

<解説>
`OPEN INPUT SYAIN-FILE.` で 'SYAIN.TXT' ファイルを読み込み専用で開きます。

`READ SYAIN-FILE` 命令で、ファイルから1レコード分のデータを読み込み、FD句で定義した SYAIN-REC に格納します。`AT END` は、もしファイルの最後まで読み込んでしまって、もう読むデータがない場合に `SET EOF TO TRUE` を実行しなさい、という意味です。(EOFはEnd Of Fileの略です)

`PERFORM UNTIL EOF` ループの中で、読み込んだデータを `DISPLAY` 命令で画面に表示し、また次の `READ` を実行します。

ファイルのデータを全て読み終わると `READ` 命令で `AT END` になり、EOFフラグが'1'になるので `PERFORM` ループを抜けます。

最後に `CLOSE SYAIN-FILE.` でファイルを閉じます。

このプログラムを実行すると、画面にはこんなふうに表示されるはずです。

社員ID  : 0001
社員名  : テスト タロウ
--------------------

ファイルの内容がちゃんと表示されたら、読み込み成功です!
OPENとCLOSEが、読み書き処理(READやWRITE)を挟む形で使われているのがわかりますね。

ファイル「OPEN文/CLOSE文」の注意点

ファイルのOPENとCLOSEは基本ですが、いくつか気をつけておきたいポイントがあります。
これを知っておくと、エラーに悩む時間がぐっと減るかもしれませんよ。

ファイル状態コード (FILE STATUS) の確認

OPEN文やCLOSE文(それとREAD文やWRITE文も)を実行したとき、実は処理が成功したかどうかの結果が「ファイル状態コード」という場所にセットされます。

これは、ENVIRONMENT DIVISION の FILE-CONTROL句で `FILE STATUS IS データ項目名` のように指定した変数(データ項目)に格納されます。

例えば、こんな感じ。

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT SYAIN-FILE ASSIGN TO 'SYAIN.TXT'
           FILE STATUS IS WS-FS.  * ← これ!

DATA DIVISION.
FILE SECTION.
FD SYAIN-FILE.
01 SYAIN-REC PIC X(14).
WORKING-STORAGE SECTION.
01 WS-FS          PIC X(2).  * ← ファイル状態コード格納用

OPENやCLOSEを実行した直後に、この `WS-FS` の中身をチェックするのがオススメです。
正常に処理が終わった場合は、通常 '00' が入ります。

もし '00' 以外だったら、何かしらのエラーが起きている証拠です。(例えば、INPUTで開こうとしたファイルが存在しない場合など)

簡単なチェック例はこんな感じ。
PROCEDURE DIVISION.
    OPEN INPUT SYAIN-FILE.
    IF WS-FS NOT = "00" THEN
       DISPLAY "ファイルOPENエラー! ステータス:" WS-FS
       STOP RUN  * エラーなら処理中断
    END-IF.

    * ここにREAD処理など

    CLOSE SYAIN-FILE.
    IF WS-FS NOT = "00" THEN
       DISPLAY "ファイルCLOSEエラー! ステータス:" WS-FS
       * CLOSEエラーは致命的ではない場合もあるが、ログ等には出す
    END-IF.
    STOP RUN.
ファイル状態コードの詳しい値には色々な種類がありますが、まずは「処理後に '00' かどうかチェックする癖をつける」だけでも、デバッグがすごく楽になりますよ!

その他の注意点 (二重OPEN、未OPENファイルのCLOSEなど)

初心者の頃にやりがちな、うっかりミスもいくつかあります。

  • 二重OPEN
    すでに開いているファイルを、もう一度OPENしようとするとエラーになります。プログラムの流れの中で、同じファイルを何度もOPENしないように気をつけましょう。
  • まだ開いていないファイルをCLOSE
    OPENしていないファイルをCLOSEしようとしても、当然エラーになります。「あれ、さっきOPENしたっけ?」とならないように、処理の流れを意識するのがいいですね。
  • OUTPUTモードでの上書き
    OUTPUTモードは、既存ファイルを問答無用で上書きします。「まだ使うファイルだったのに消しちゃった!」とならないように、OUTPUTモードを使うときは本当にそのファイルが新規作成か上書きで良いか、よく確認しましょう。追記したい場合はEXTENDモードを使います。

プログラムが複雑になってくると、ファイルの開閉状態がわからなくなることもあります。
そんなときは、ファイル状態コードのチェックが役立ちますね!

【まとめ】COBOLファイル操作の基本を押さえよう

お疲れ様でした! COBOLのファイル操作の入口であるOPEN文とCLOSE文について、基本的なところを見てきました。

今回のポイントをまとめておきましょう。

  • ファイルを使う前には OPEN文 で「開く」宣言が必要。
  • OPEN文には目的別に INPUT, OUTPUT, I-O, EXTEND の4つのモードがある。
  • 使い終わったファイルは必ず CLOSE文 で「閉じる」。
  • OPENとCLOSEは 必ずペア で使う。
  • OUTPUTモードは ファイルを上書きする ので注意が必要。
  • 処理が成功したか ファイル状態コード (FILE STATUS) で確認する癖をつけると良い。

最初はちょっととっつきにくいファイル操作も、このOPENとCLOSEの役割と使い方をしっかり押さえておけば、もう大丈夫!

自信を持って、次のステップ(READ文やWRITE文を使った本格的なデータの読み書き)に進んでいけますよ。

【関連記事】

>> 今さら聞けない「COBOLとは?」

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ