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句と連携)
- レコードの形式や長さを指定する
- ラベルレコードの有無を明示する
- ブロック化因数を指定する
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が選ばれることもあります。
「標準ラベルって何?」と聞かれたら、「ファイルにくっついてる“名札”みたいなもん」と答えると、だいたい伝わります。
- `SELECT` で論理ファイル名を定義し、OS上のファイル名と結びつけています。
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).
- `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で覚えておくと安心です。
【まとめ】FD宣言を理解してCOBOLファイル処理の第一歩を踏み出そう
FD宣言は、ファイルの“取扱説明書”のようなものです。どんなファイルを使うのか、どんな形のデータが入っているのか、COBOLにきちんと伝えるために欠かせません。この記事では、FD宣言の書き方から始まり、構文ルール、主要な句、注意点まで一通り紹介しました。ピリオド1つにも気を配るCOBOLならではの“丁寧さ”が、ファイル処理の確実さにつながっていきます。
今、自分でFDを書けるようになったという実感があれば、それは立派な一歩です。ファイル処理をマスターすれば、COBOLの世界が一気に広がります。
これからも焦らず、少しずつ経験を重ねていきましょう。
【関連記事】