基本的な計算や表示はできるようになったけど、ファイルの扱い方がイマイチわからない…特に「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' が入ります。
簡単なチェック例はこんな感じ。
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文を使った本格的なデータの読み書き)に進んでいけますよ。
【関連記事】
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。