COBOLの「WRITE文」とは?基本構文と使い方を分かりやすく解説

2025年4月10日木曜日

COBOL

COBOLでファイルにデータを書き込みたいけど、「WRITE文ってどう使うの?」「なんだか難しそう…」なんて思っていませんか? 

この記事では、COBOLのファイル出力で欠かせないWRITE文について、ゼロから丁寧に解説していきます。基本の書き方から、実際に動くサンプルコード、ちょっと応用的な使い方、そして「あちゃー!」となりがちな注意点まで、しっかり網羅していますよ。

読み終わるころには、「なるほど、WRITE文ってこう使うのか!」とスッキリ理解できているはず。さあ、一緒にCOBOLのファイル出力マスターを目指しましょう!

この記事で学べること

  • WRITE文が何をする命令なのか
  • WRITE文の基本的な書き方のルール
  • 簡単なファイル出力プログラムの作り方
  • WRITE文を使った改行や改ページの制御方法
  • WRITE文を使うときに気をつけたいポイント

COBOLの「WRITE文」とは?ファイル出力の心臓部

COBOLのWRITE文は、プログラムで作ったデータや計算結果を、ファイルという名の「ノート」に書き込むための命令です。ちょうど、レポートを書いて紙に出力するようなイメージですね。

ファイル出力の処理は、ざっくり言うとこんな流れになります。

  1. ファイルを使う準備をする(OPEN)
  2. 書き込みたいデータを用意する(MOVEとか)
  3. 実際にファイルに書き込む(WRITE) ← ココ!
  4. 使い終わったファイルを片付ける(CLOSE)

WRITE文は、この流れの中で実際に「書き込む」という、まさに心臓部とも言える役割を担っています。

だから、COBOLでファイル操作をしたいなら、WRITE文の理解は避けて通れない道なのです。でも、安心してください。基本さえ押さえれば、決して難しいものではありませんよ。

「WRITE文」の基本的な書き方

まずは、WRITE文の基本的な形、つまり書き方のルール(構文)を見てみましょう。一番シンプルな形は、これだけです。

WRITE レコード名.

たったこれだけ?と思うかもしれませんが、基本は本当にシンプルなんです。

  • WRITE これは「書き込みますよ!」という命令そのものです。
  • レコード名 これは、事前に「こういう形式でデータを書き込みます」と定義しておいた「データの入れ物」の名前を指定します。この「データの入れ物」の定義は、DATA DIVISIONFILE SECTION という場所で、FD句 を使って行います。(後でサンプルコードで詳しく見ますね!)
  • 最後の . (ピリオド) を忘れずに!COBOLでは文の終わりにピリオドが必要です。

まずは「WRITE 書き込みたいデータの入れ物名.」という形を、呪文のように覚えてしまいましょう!

「WRITE文」の使い方:シンプルなファイル出力サンプル

では、実際にWRITE文を使った簡単なプログラムを見ていきましょう。ここでは、「OUTPUT.TXT」というファイルに「HELLO COBOL WORLD!」という文字を書き込むサンプルです。

IDENTIFICATION DIVISION.
PROGRAM-ID. SIMPLE-WRITE.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

    SELECT OUTPUT-FILE ASSIGN TO 'OUTPUT.TXT'
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.

FD  OUTPUT-FILE.
01  OUTPUT-RECORD       PIC X(20).

WORKING-STORAGE SECTION.


PROCEDURE DIVISION.

    OPEN OUTPUT OUTPUT-FILE.
    MOVE 'HELLO COBOL WORLD!' TO OUTPUT-RECORD.
    WRITE OUTPUT-RECORD.
    CLOSE OUTPUT-FILE.

    STOP RUN.

このプログラムを実行すると、プログラムがあるフォルダに「OUTPUT.TXT」というファイルが作られ、その中に文字が書き込まれます。

サンプルプログラムの解説

ちょっと長いプログラムに見えますが、一つずつ見ていけば大丈夫です。

  • ENVIRONMENT DIVISIONFILE-CONTROL
    ここでは、プログラムの中で使うファイルの名前(論理ファイル名:OUTPUT-FILE)と、実際にパソコン上に作られるファイルの名前(物理ファイル名:OUTPUT.TXT)を結びつけています。「このプログラムでOUTPUT-FILEって言ったら、OUTPUT.TXTのことね」と教えている感じです。
  • DATA DIVISIONFILE SECTION (FD句)
    FD OUTPUT-FILE. で、先ほど関連付けたOUTPUT-FILEの詳しい情報を定義しますよ、という宣言です。
    その下の 01 OUTPUT-RECORD PIC X(20). で、実際に書き込むデータを入れるための「レコード」を定義しています。ここでは OUTPUT-RECORD という名前で、20桁の文字データが入る領域を確保しています。このPIC X(20)がデータの形式や長さを示します。
  • PROCEDURE DIVISION (手続き部)
    ここが実際の処理を書く部分です。
    1. OPEN OUTPUT OUTPUT-FILE.
      まず、ファイルを書き込み可能な状態にするために「開きます」(オープン)。OUTPUTモードは「新規書き込み」または「上書き」用です。
    2. MOVE 'HELLO COBOL WORLD!' TO OUTPUT-RECORD.
      書き込みたい文字データを、先ほどFD句で定義したレコード領域 OUTPUT-RECORD に移動(MOVE)させています。
    3. WRITE OUTPUT-RECORD.
      いよいよ主役の登場! OUTPUT-RECORD に入っている内容を、OUTPUT-FILE(つまりOUTPUT.TXT)に書き込みます。ここで指定するレコード名は、FD句で定義したものと一致させる必要があります。
    4. CLOSE OUTPUT-FILE.
      書き込みが終わったら、ファイルを「閉じます」(クローズ)。これを忘れると、データが正しく書き込まれないことがあるので、必ず行いましょう。
    5. STOP RUN.
      プログラムの処理を終了します。お疲れ様でした!

実行結果の確認

上記のサンプルプログラムを実行すると、OUTPUT.TXT というファイルが作成され、その中身は以下のようになります。

HELLO COBOL WORLD!

ちゃんと、MOVE命令でセットした文字が書き込まれていますね! PIC X(20) で20桁確保しましたが、実際のデータが短い場合は、その長さ分だけが書き込まれ、後ろに余計な空白などは(通常)つきません(これはORGANIZATION IS LINE SEQUENTIAL のおかげでもあります)。

思った通りにデータがファイルに書き出されるのを確認できると、嬉しいものですよね。

【応用編】「WRITE文」の便利オプション(ADVANCING句)

基本的な書き方だけでもファイル出力はできますが、帳票(レポートや伝票など)を作成するときには、「書き込んだ後に改行したい」とか「次のページの頭から書きたい」といった制御が必要になります。

そんな時に活躍するのが ADVANCING句 オプションです。これをWRITE文に追加することで、書き込み前後の改行や改ページをコントロールできるのです。

プリンターで印刷するときの紙送りをイメージすると分かりやすいかもしれません。

ADVANCING句 には、主に書き込み後に紙送りする AFTER ADVANCING と、書き込み前に紙送りする BEFORE ADVANCING の2種類があります。

AFTER ADVANCING句の使い方

AFTER ADVANCING は、「指定したレコードを書き込んだ後」に改行や改ページを行います。一番よく使うパターンかもしれません。

書き方例

* 書き込み後、1行改行する
WRITE OUTPUT-RECORD AFTER ADVANCING 1 LINE.

* 書き込み後、3行改行する
WRITE OUTPUT-RECORD AFTER ADVANCING 3 LINES.

* 書き込み後、次のページの先頭に移動する (改ページ)
WRITE OUTPUT-RECORD AFTER ADVANCING PAGE.

例えば、AFTER ADVANCING 1 LINE を使うと、データを1行書き込んだ後に、カーソル(書き込み位置)が次の行の先頭に移動します。連続してWRITEすれば、1行ずつデータが書き込まれていくイメージです。帳票の明細行などを出力するときによく使われます。

BEFORE ADVANCING句の使い方

BEFORE ADVANCING は、「指定したレコードを書き込む前」に改行や改ページを行います。

書き方例

* 1行改行してから、書き込む
WRITE OUTPUT-RECORD BEFORE ADVANCING 1 LINE.

* 2行改行してから、書き込む
WRITE OUTPUT-RECORD BEFORE ADVANCING 2 LINES.

* 次のページの先頭に移動してから、書き込む (改ページ)
WRITE OUTPUT-RECORD BEFORE ADVANCING PAGE.

例えば、「見出しを書き出す前に必ず改ページしたい」といった場合に BEFORE ADVANCING PAGE が使えます。

AFTERBEFORE は、処理の順番が逆になるだけで、指定できる内容はほぼ同じです。どちらを使うかは、プログラムの処理の流れや、作りたい帳票のレイアウトによって使い分けると良いでしょう。

COBOLの「WRITE文」を使う上での注意点

WRITE文は便利ですが、いくつか注意しないとエラーになったり、思った通りに動かなかったりすることがあります。よくある落とし穴をいくつか紹介しますね。

  • ファイルが開かれていない、またはモードが違う
    WRITE文を使う前に、必ずファイルを書き込み可能なモード (OUTPUT または I-O) で OPEN する必要があります。OPEN を忘れたり、読み取り専用の INPUT モードで開いているファイルに書き込もうとすると、エラーが発生します。「あれ、書き込めないぞ?」と思ったら、まずOPEN文を確認しましょう。
  • レコード名の間違い
    WRITE文で指定するレコード名は、FD句で定義したレコード名と完全に一致させる必要があります。タイプミスなどがあると、コンパイルエラーになります。
  • データ桁数とレコード定義の不一致
    MOVE などでレコードにセットするデータの桁数が、FD句で定義したレコードの桁数(PIC句で指定した桁数)を超えてしまうと、データの一部が欠けてしまったり、意図しない場所に書き込まれたりする可能性があります。書き込むデータの長さには注意を払いましょう。
  • ADVANCING句とファイルの種類の相性
    ADVANCING句 は、主に帳票出力(プリンターへの出力)を想定した機能です。通常のデータファイルに対して使うと、意図しない制御コードが埋め込まれたり、環境によっては無視されたりすることがあります。通常のデータファイルなら ADVANCING句 なしでWRITEし、テキストエディタで扱いやすいように改行コードを含めたい場合は、レコード定義自体に改行コードを含めるなどの工夫が必要になる場合もあります。

これらの点に気をつけるだけで、WRITE文のエラーはかなり減らせるはずです!

「WRITE文」を使った実践的なファイル出力処理の流れ

最後に、もう少しだけ実践的な例として、ループ処理を使って複数行のデータをファイルに書き込む処理の流れを見てみましょう。ここでは、1から5までの数字をそれぞれ別の行に書き出すサンプルです。

IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-WRITE.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT NUM-FILE ASSIGN TO 'NUMBER.TXT'
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD  NUM-FILE.
01  NUM-RECORD          PIC X(5). * 少し余裕を持たせた桁数

WORKING-STORAGE SECTION.
01  WS-COUNTER          PIC 9(1) VALUE 1.

PROCEDURE DIVISION.
* ファイル書き込み準備
    OPEN OUTPUT NUM-FILE.

* WS-COUNTERが5以下の間、処理を繰り返す (ループ処理)
    PERFORM UNTIL WS-COUNTER > 5
        * カウンターの値をレコードにセット
        MOVE WS-COUNTER TO NUM-RECORD
        * レコードを書き込み (1行改行付き)
        WRITE NUM-RECORD AFTER ADVANCING 1 LINE
        * カウンターを1増やす
        ADD 1 TO WS-COUNTER
    END-PERFORM.

* ファイルの後片付け
    CLOSE NUM-FILE.

* プログラム終了
    STOP RUN.

このプログラムでは、PERFORM UNTIL ... END-PERFORM というループ構文を使っています。

  1. WS-COUNTER という変数を用意し、初期値を1にします。
  2. WS-COUNTER が5より大きくなるまで、以下の処理を繰り返します。
  3. 現在の WS-COUNTER の値を NUM-RECORD にセットします。
  4. WRITE NUM-RECORD AFTER ADVANCING 1 LINE で、レコードの内容をファイルに書き込み、改行します。
  5. WS-COUNTER の値を1増やします。
  6. ループの最初に戻り、WS-COUNTER が5より大きいかチェックします。

この結果、「NUMBER.TXT」ファイルには以下のように出力されます。

1
2
3
4
5

このように、ループ処理とWRITE文を組み合わせることで、大量のデータを効率的にファイルへ書き出すことができます。実際の業務プログラムでは、このような繰り返し処理が非常によく使われます。

【まとめ】COBOLの「WRITE文」を理解して使いこなそう!

今回は、COBOLのファイル出力の基本となるWRITE文について解説してきました。最後に、今回のポイントをまとめておきましょう。

  • WRITE文は、ファイルにデータを書き込むための命令。
  • 基本の形は WRITE レコード名. で、FD句で定義したレコード名を指定する。
  • ファイルは書き込み前に OPEN OUTPUT (または I-O) する必要がある。
  • ADVANCING句 を使うと、書き込み前後の改行や改ページを制御できる。
    • AFTER ADVANCING は書き込み後に処理。
    • BEFORE ADVANCING は書き込み前に処理。
  • OPEN忘れ、レコード名のミス、データ桁数に注意する。
  • ループ処理と組み合わせることで、複数データの書き込みも効率的に行える。

どうでしたか? WRITE文の使い方が、だいぶイメージできたのではないでしょうか。

最初は戸惑うこともあるかもしれませんが、実際にコードを書いて動かしてみるのが一番の近道です。今回のサンプルコードなどを参考に、ぜひ自分の手で試してみてくださいね。

WRITE文をマスターすれば、COBOLでのファイル操作がぐっと楽になります。自信を持って、次のステップに進んでいきましょう!

【関連記事】

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

このブログを検索

  • ()

自己紹介

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

QooQ