COBOLファイル記述項(FD宣言)とは?初心者向けに徹底解説

2025年4月8日火曜日

COBOL

COBOLのプログラムを書いていると、「FDって何だよ……」と手が止まる瞬間、ありませんか?見慣れない英字が並んでるだけで、なんだか難しそうに見えてきますよね。

この記事では、COBOLのファイル処理に欠かせない「ファイル記述項(FD宣言)」について、超基礎から実用的な記述例まで、ひとつずつわかりやすく解説します。

FDの役割・構文・使い方が、初めてでもすっきり理解できる内容です。

「FDが読めたらCOBOLマスターっぽく見えるかも…?」

そんな気分で、ちょっとニヤリとしながら読んでみてください。

COBOLのファイル記述項(FD宣言)とは?まず基本を理解しよう

COBOLでファイルを扱うには、まず「どんなファイルを使うのか?」をプログラムに伝えないといけません。ここで活躍するのがファイル記述項(FD宣言)です。 

ファイル記述項は、COBOLプログラムの「データ部(DATA DIVISION)」の中でも「ファイル節(FILE SECTION)」に書かれます。場所としては、SELECT文でファイル名を指定したあとに続く部分です。 ちなみに「FD」は「File Description」の略です。

直訳すると「ファイルの説明」ですが、もう少しわかりやすく言えば、FD宣言はファイルの“設計図”のようなものです。どんなレコードがあるのか、どのくらいの長さなのか、OSにちゃんと伝える役目をしています。 

プログラムの流れの中で言えば、FDがなければファイルの読み書きが何もできません。読み書きの前に、まず“仕様書”で設計を伝える感じですね。
DATA DIVISION.
FILE SECTION.

FD  顧客ファイル
    LABEL RECORDS ARE STANDARD
    BLOCK CONTAINS 0 RECORDS.

01  顧客レコード.
    05 顧客ID     PIC 9(5).
    05 顧客名     PIC X(20).
ファイル節の中で、FDから始まるブロックがファイル記述項です。ここにレコード構造もまとめて記述します。 

なぜCOBOLプログラムにファイル記述項(FD宣言)が必要なのか?

「FDって書かないといけないの?」と感じたことがあるかもしれません。
はい、FD宣言は省略できません。

書かないと、そもそもファイルを扱うことができません。 COBOLでは、ファイルを使う前に「どんなファイルか」を事前に定義しておく必要があります。FD宣言は、その定義を行う部分です。下の4つの情報を指定するために使われます。
  • ファイル名を定義する(SELECT句と連携)
  • レコードの形式や長さを指定する
  • ラベルレコードの有無を明示する
  • ブロック化因数を指定する
例えば、レコードの長さがわからないままだと、読み取り時に「どこからどこまでが1件なのか」が判断できません。それは本を読む時に、ページの番号がバラバラなような状態です。困りますよね。 

FD宣言はプログラムとOSの“共通言語”です。これがあることで、ファイルの読み書きをスムーズに行えるようになります。
FD 売上ファイル
   LABEL RECORDS ARE OMITTED
   BLOCK CONTAINS 10 RECORDS.
このように書くだけで、OSに対して「このファイルはラベルなし」「1ブロックに10レコードあるよ」としっかり伝わります。

COBOL ファイル記述項(FD宣言)の基本的な書き方(構文ルール)

FD宣言は、COBOLのファイル処理に欠かせない“入り口”です。見た目はシンプルですが、ルールを間違えるとすぐにエラーが出ます。 まず基本構文はこちらです。
FD ファイル名 [句...].
最初に「FD」と書き、そのすぐ後ろにファイル名を記述します。必要ならラベル句やブロック句などを続け、最後はピリオド「.」で終わるのが決まりです。 

 そして忘れてはいけないのが、FD宣言に書くファイル名は、SELECT句で定義した名前と一致していなければいけないという点です。少しでも違うと、コンパイル時に容赦なく怒られます。 極端なシンプル版はこちらです。
FD  INPUT-FILE.
句が何もない最小形ですが、これでもちゃんと構文としてはOKです。もちろん実際の処理では追加の句が必要になりますが、まずはこの形を覚えておけば安心です。 

最重要!SELECT句との連携

FD宣言とSELECT句は、必ずペアで使うというルールがあります。 

SELECT句は「環境部(ENVIRONMENT DIVISION)」の「FILE-CONTROL」に書きます。プログラム内で使う論理的なファイル名を決める場所です。そしてFD宣言は「データ部(DATA DIVISION)」の「ファイル節(FILE SECTION)」に書きます。 

ここがズレていると、まったく同じファイルを指しているつもりでも、プログラムには別物と認識されてしまいます。 正しい例:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT  INPUT-FILE ASSIGN TO "input.txt".

DATA DIVISION.
FILE SECTION.
FD  INPUT-FILE.
名前が一致しているので問題ありません。 間違った例:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT  INFILE ASSIGN TO "input.txt".

DATA DIVISION.
FILE SECTION.
FD  INPUT-FILE.
SELECT句が「INFILE」、FDが「INPUT-FILE」では不一致です。この状態でコンパイルしようとするとエラーになります。 

COBOLは名前に厳しい性格なので、“名前の一致”は最優先事項として覚えておきましょう。コーヒーにミルクを入れる前に、コップが同じじゃないと意味ないようなものですね。

FD宣言でよく使われる主要な句を解説

FD宣言の中には、ファイルの性質や動作に関わる“句”がいくつか登場します。

ただ書くだけじゃなくて、それぞれの意味を知ることで、ファイル処理の理解がグッと深まります。 ここでは、よく使われる代表的な句を紹介します。次の見出しで、ひとつずつ順番に見ていきましょう。 

RECORD CONTAINS句:レコード長を指定する

RECORD CONTAINS句は、1レコードの長さを明示的に指定する句です。特に固定長レコードでよく使われます。 書き方はシンプルです。
RECORD CONTAINS 80 CHARACTERS.
この場合、レコードの長さは常に80バイトです。 可変長にしたい場合は、こう書きます。
RECORD CONTAINS 40 TO 100 CHARACTERS.
最低40バイトから最大100バイトの範囲で、1レコードのサイズが変動する形式になります。 なお、この句を省略しても、コンパイラがレコード定義から自動的に判断してくれることが多いです。でも可読性や意図を明確にするために、明記しておくのが無難です。 

LABEL RECORDS句:ラベルレコードの有無

ファイルの最初や最後にくっつく管理情報、それがラベルレコードです。LABEL RECORDS句では、その有無を指定します。 基本の2種類はこちら。
LABEL RECORDS ARE STANDARD.
LABEL RECORDS ARE OMITTED.
STANDARDは「標準ラベルあり」。OMITTEDは「ラベルなし」です。 例えば、ディスクファイルならSTANDARDがよく使われます。

一方で、プリンターファイルなど一時的な出力先ではOMITTEDが選ばれることもあります。 「標準ラベルって何?」と聞かれたら、「ファイルにくっついてる“名札”みたいなもん」と答えると、だいたい伝わります。

BLOCK CONTAINS句:ブロック化因数を指定

ブロック化とは、複数のレコードをまとめて1回のI/Oで処理する仕組みです。これを使えば読み書きが効率よくなります。 BLOCK CONTAINS句は、そのブロックの単位を指定します。
BLOCK CONTAINS 10 RECORDS.
BLOCK CONTAINS 1024 CHARACTERS.
上は「10件のレコードを1ブロックにまとめる」、下は「1ブロックあたり1024バイトにする」といった意味になります。 0を指定するとこうなります。
BLOCK CONTAINS 0 RECORDS.
この場合はOSが自動で最適なブロックサイズを決めてくれます。最近の環境だと、これに任せるケースも増えています。 

DATA RECORD句:レコード名を定義する

FDの下に記述するレコード定義。その名前を指定するのがDATA RECORD句です。
DATA RECORD IS 顧客レコード.
この場合、FDの下には次のようなレコード定義が来るのが自然です。
01 顧客レコード.
   05 顧客ID     PIC 9(5).
   05 顧客名     PIC X(20).
レコード名は必ず一致させる必要があります。名前が違うとエラーになります。 ファイルに複数のレコード形式がある場合は、次のように書きます。
DATA RECORDS ARE 顧客レコード 売上レコード.
このようにして、1つのファイルに複数のレコードパターンを紐づけることもできます。 

COBOL ファイル記述項(FD宣言)の具体的な記述例

これまで紹介してきた句をまとめて、実際のコードとしてどう書くかを見てみましょう。
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT INPUT-FILE ASSIGN TO "input.txt".

DATA DIVISION.
FILE SECTION.

FD  INPUT-FILE
    RECORD CONTAINS 80 CHARACTERS
    LABEL RECORDS ARE STANDARD
    BLOCK CONTAINS 0 RECORDS
    DATA RECORD IS INPUT-RECORD.

01  INPUT-RECORD.
    05 ID      PIC 9(5).
    05 NAME    PIC X(20).
    05 AGE     PIC 9(3).

- `SELECT` で論理ファイル名を定義し、OS上のファイル名と結びつけています。 
- `FD` の行ではファイルの構造や性質を宣言。 
- `RECORD CONTAINS` でレコードの長さを明示。 
- `LABEL RECORDS` でラベルの有無を指定。 
- `BLOCK CONTAINS` はOSに任せています(0指定)。 
- `DATA RECORD IS` でレコード名を決め、その直後に構造を定義しています。 

 この形をベースにして、用途に合わせて微調整していけばOKです。

初心者が注意すべきFD宣言のポイントとよくある間違い

FD宣言は見た目がシンプルな分、つまずくと原因に気づきにくいです。特に始めたばかりの人が間違えやすいポイントをまとめました。失敗のパターンを知っておくだけでも、トラブルをぐっと減らせます。
  • SELECT句とFDのファイル名が一致していない
    SELECTで定義した論理名と、FDで使う名前は完全に同じでなければエラーになります。似ていてもアウトです。
    よくあるエラー: FILE NOT FOUND、UNDEFINED FILE NAME など
  • 句の記述順序がめちゃくちゃ
    現代のCOBOLは多少柔軟ですが、古い処理系だと順序ミスで怒られることも。RECORD CONTAINS → LABEL RECORDS → BLOCK CONTAINS → DATA RECORD の順を意識しましょう。
  • ピリオド「.」のつけ忘れ、または余計なピリオド
    COBOLはピリオドの位置にもシビアです。終わらせたい文にピリオドを忘れると、次の文まで巻き込まれてエラーになることがあります。
  • RECORD CONTAINS句と01レベルレコードの長さが一致しない
    例えばRECORD CONTAINS 80 CHARACTERSと書いてるのに、実際の01レコードの合計が85バイトあると矛盾します。
    よくあるエラー: RECORD LENGTH MISMATCH
  • LABEL RECORDS句の指定ミス
    プリンターファイルにSTANDARDと書くと、ラベル処理を期待されて想定外の動作になります。基本はディスク=STANDARD、プリンター=OMITTEDで覚えておくと安心です。
ちょっとしたミスでも、COBOLは遠慮なくエラーを出してきます。でも裏を返せば、それだけ「きっちり書けばきっちり動く」言語です。 

【まとめ】FD宣言を理解してCOBOLファイル処理の第一歩を踏み出そう

FD宣言は、ファイルの“取扱説明書”のようなものです。どんなファイルを使うのか、どんな形のデータが入っているのか、COBOLにきちんと伝えるために欠かせません。

この記事では、FD宣言の書き方から始まり、構文ルール、主要な句、注意点まで一通り紹介しました。ピリオド1つにも気を配るCOBOLならではの“丁寧さ”が、ファイル処理の確実さにつながっていきます。 

今、自分でFDを書けるようになったという実感があれば、それは立派な一歩です。ファイル処理をマスターすれば、COBOLの世界が一気に広がります。 これからも焦らず、少しずつ経験を重ねていきましょう。

このブログを検索

  • ()

自己紹介

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

QooQ