この章では、次の事項について説明します。
この COBOL システムと、この COBOL システムを使って作成したアプリケーションでは、標準的な UNIX のファイル命名規則を採用しています。
物理的なファイル名、または、実行時に物理的な名前にマップできる論理的なファイル名を指定するには、SELECT 文の ASSIGN 句を使用します。
ファイル名の割り当てには、次のような 3 種類の方法があります。
SELECT 文の ASSIGN 句でファイル名をリテラルとして指定します。
SELECT 文の ASSIGN 句でファイル名をデータ項目として指定するので、実行時にプログラムで変更することができます。
SELECT 文の ASSIGN 句でファイル名を EXTERNAL として指定し、実行時に決定します。
これら 3 種類すべてのファイル名の割り当て方法でファイル名のランタイムマッピングを使用することができます。
ファイル名の静的割り当てでは、ファイル名を SELECT 文でリテラルとして指定します。
select filename assign to literal.
次の例では、stockfile を開くと、現在のディレクトリにある warehs.buy ファイルが開きます。
select stockfile assign to "warehs.buy".
次の例では、input-file を開くと、現在のディレクトリに相対的な data ディレクトリの prog ファイルが開きます。
select input-file assign to "data/prog".
ファイル名の動的割り当てでは、ファイル名を SELECT 文で COBOL データ項目として指定します。
select filename assign to dynamic data-item
各パラメータの内容は次のとおりです。
data-item | COBOL データ項目の名前です。プログラムでデータ項目が明示的に宣言されていない場合、ピクチャ句 PIC X(255) を使用して、コンパイラがデータ項目を自動的に作成します。ファイルに対して OPEN 文を実行する前に、プログラムでデータ項目の値を指定する必要があります。 |
ASSIGN"DYNAMIC" コンパイラ指令を使用する場合には、ASSIGN 句から DYNAMIC という単語を省略することができます。
次の例では、input.dat というファイルが現在のディレクトリに作成されます。
... select fd-in-name assign to dynamic ws-in-file. ... working-storage section. 01 ws-in-file pic x(30). ... move "input.dat" to ws-in-file. ... open output fd-in-name.
ファイル名の外部割り当てでは、ファイル名を SELECT 文で次のように指定します。
select filename assign to external external-file-reference
各パラメータの内容は次のとおりです。
external-file-reference | 外部環境に指定されたファイルでさらにマッピングが可能かどうかを識別する COBOL 語です。external-file-reference に 1 つまたは複数のハイフン (-) が含まれる場合、最後のハイフンまでのすべての文字が無視されます (最後のハイフンも無視されます)。 |
ランタイムファイル名マッピングの詳細については、『ファイル名マッピング』の項を参照してください。
You can include a library name in the name of a file you want to open. The file specification is of the form:
/library-name.lbr/filename.ext
/appdir/applib.lbr/app.dat
This type of filename is only valid when used as the name of a data file being opened in read-only mode, using either OPEN INPUT syntax or the CBL_OPEN_FILE byte stream routine. If the library is not already open, this call will open that library on the given device and leave it open after the call. If the library does not exist, or if the given filename.ext does not exist in that library, a "file not found" error is returned.
この COBOL システムには、プログラムで ASSIGN 句を使用して指定したファイル名を別の名前にマップする方法が複数あるため、実行時に柔軟に対応できます。
ファイルハンドラにファイル名 (リテラル、データ項目の内容、または、ASSIGN TO EXTERNAL 構文を使用した場合は外部リファレンスとしてのファイル名) が指定されている場合は、その名前の最初の要素を分離します。つまり、バックスラッシュ (\) がある場合は、最初のバックスラッシュ文字より前にあるすべてのテキストを分離します。また、ファイル名がバックスラッシュ文字で始まる場合には分離させません。これらの処理の後で、次の処理を行います。
この処理結果を物理ファイルのファイル名にします。
例
ASSIGN 句のファイル名 | 検索対象の環境変数 | 環境変数の内容 | 物理ファイルのファイル名 |
dir/file1 | dd_dir | d2 | d2/file1 |
dir/file1 | dd_dir | d2/d4 | d2/d4/file1 |
dir1/dir2/file1 | dd_dir1 | d4 | d4/dir2/file1 |
dir1/dir2\file1 | dd_dir1 | d2/d4 | d2/d4/dir2/file1 |
file1 | dd_file1 | d2 | d2 |
環境変数の名前にピリオド ( . ) が使用できない場合でも、ファイル名にはピリオドを使用することがよくあります。このため、ピリオドを含む論理ファイル名をマップする場合があります。この場合は、"." をアンダスコア文字 ( _ ) で置き換える必要があります。例えば、次のようになります。
dd_file_PNT=/usr/qa/myfile.pnt
refers to the logical filename file.PNT.
ファイル名のマッピングに使用する環境変数は、複数のパス名を指します。そのため、環境変数が指定した最初のパスに対して「ファイルが見つからない」という状態が返されると、システムは次のファイルを検索します。
次のような dd_dir という名前の環境変数があると仮定します。
dd_dir=/a/b;/c/d;
この場合、\a\b に対して「ファイルが見つからない」という状態が返されると、システムは、割り当てられたファイルを \c\d で検索します。
注:
You can include library names in a multiple path environment variable. For example, if you have issued the command:
set test=/apdir;/aplbr/aplbr.lbr;/aplbr/aplbr1.lbr
the filename $test/app.dat would be resolved to /aplbr/aplbr.lbr/app.dat if /apdir/app.dat did not exist.
The libraries are searched in the order they appear in the environment variable.
You can also specify a library as part of the search path for program calls. For example, if you have issued the command
set appath=/apdir/progs1.lbr;/appdir/progs2.lbr
you can use the format:
call "$appath/prog"
Your COBOL development system will search the libraries progs1.lbr and progs2.lbr for the program prog1. The libraries are searched in the order they appear in the environment variable. Any library searched remains open during the execution of the application, unless the application itself explicitly closes it.
プリンタに直接レポートを送信するか、通信ポートを通してデータを転送するための COBOL プログラムを作成することができます。そのためには、COBOL ファイル名にデバイス名を割り当てる必要があります。
次に示すデバイス名は、ファイル名の静的割り当て、動的割り当て、または、外部割り当てを使用して指定することができます。
CON | コンソールキーボードまたは画面 |
PRN | 最初のパラレルプリンタ |
LPT1 | 最初のパラレルプリンタ |
LPT2 | 2 番目のパラレルプリンタ |
LPT3 | 3 番目のパラレルプリンタ |
COM1 | 最初の非同期通信ポート |
COM2 | 2 番目の非同期通信ポート |
これらのデバイス名を指定するときに、末尾にコロン (:) を指定することもできます。
次の例では、fd-name
へ読み書き操作を行うと、コンソール画面でデータの読み書きが行われます。
select fd-name assign to "con".
この例では、fd-name
へ書込み操作を行うと、データが最初のパラレル プリンタである lpt1:
に出力されます。
select fd-name assign to dynamic ws-filename. ... move "lpt1:" to ws-filename.
COBOL ファイル構文を使用して、別のプロセス (dir コマンドなど) を起動し、そのプロセスの標準入力にデータを書き込んだり、そのプロセスの標準出力からのデータを読み込んだりすることができます。この場合、COBOL ファイル編成は、LINE SEQUENTIAL または RECORD SEQUENTIAL のどちらかである必要があります。
プロセスを起動し、データを標準入力に書き込むためには、ファイル名の > 記号の後にコマンド名を続ける必要があります。ファイルは、出力ファイルとして開く必要があります。
例
select output-file assign to ">lpr" organization is line sequential. ... open output output-file write output-file-record from "Hello world".
この例では、プログラムは文字列、Hello world を印刷プロセスの標準入力に渡します。
プロセスを起動し、標準出力からデータを読み込むには、< 記号の後にコマンド名を続ける必要があります。ファイルは、入力ファイルとして開く必要があります。
例
select input-file assign to "<ls" organization is line sequential. ... open input input-file read input-file
この例では、プログラムは ls プロセスを起動し、そのプロセスが標準出力に書き込む最初の行を読み込みます。
双方向パイプは、入力パイプと出力パイプの機能を組み合わせたものです。双方向パイプを使用するには、ファイル名のパイプ記号 (|) の後にコマンド名を続ける必要があります。ファイルは、入出力ファイルとして開く必要があります。
例
select i-o-file assign to "| cat" organization is line sequential. ... open i-o i-o-file write i-o-file-record from "Hello world" read i-o-file
この例では、プログラムは cat プロセスを起動し、Hello world という行を標準入力に渡します。次に、cat プロセスの標準出力から 1 レコードを読み込みます。
Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.