![]() |
その他のトピック | 呼び出し可能ソート API | ![]() |
標準の COBOL READ および WRITE 文は、ファイルの入出力操作中にフォーマットされたデータ (レコード) を処理します。また、ファイルをバイトストリームとして処理することもできます。つまり、読み取るまたは書き込むブロックの開始位置と長さを指定して、ファイル内のデータにアクセスします。この章では、ファイルにバイトストリームとしてアクセスできる COBOL システムのライブラリルーチンについて説明します。
バイトストリーム入出力を使用すると、このシステムではサポートされない形式のファイルやユーザ独自の形式のファイルを処理したり、独自のファイルハンドラを書き込んだり、あるいは単純なテキストのストリームとして行順ファイルを処理することができます。
注意: COBOL 構文または呼び出し可能ファイルハンドラでサポートされる形式のファイルにアクセスする場合は、バイトストリーム入出力を使用しないでください。このような場合にバイトストリーム入出力を使用すると、ファイルが簡単に破損する可能性があります。
Infomgr を使用して参照できるプログラム例、 byteio.cbl は、これらのルーチンの使用法を示しています。この項の内容を参照しながら、このプログラム例を確認することができます。コード内では、ファイルのサイズを判断する部分と、プログラムがファイルの終わりを超えて読み取られていないかどうかを確認するために実行するチェックの部分に特に注意してください。
| CBL_CREATE_FILE | 出力用のファイルを開きます。ファイルがすでに存在する場合は、このルーチンによってそのファイルが上書きされます。 |
| CBL_OPEN_FILE | バイトストリーム入出力用のファイルを開きます。 |
| CBL_READ_FILE | ファイルから指定したバイト数またはバッファに収まるバイト数を読み取ります。 |
| CBL_WRITE_FILE | 指定したバイト数をファイルに書き込みます。 |
| CBL_CLOSE_FILE | 他のファイルで使用するためにファイルハンドラを解放します。明示的にファイルを閉じていない場合は、ランタイムシステムによって、プログラムの終了時にファイルが閉じられます。 |
| CBL_FLUSH_FILE | メモリバッファ内のすべてのデータがディスクに書き込まれます。
|
次のライブラリルーチンは、バイトストリーム入出力ルーチンを補足します。
| CBL_GET_RECORD_LOCK | ファイルのレコードロックを取得します。 |
| CBL_FREE_RECORD_LOCK | ファイルのレコードロックを解除します。 |
| CBL_TEST_RECORD_LOCK | ファイルのレコードロックをテストします。 |
例
次のコード例は、ファイルを作成します。
call "CBL_CREATE_FILE"
using filename, access-mode, deny-mode,
device, file-handle
バイトストリーム入出力はバイトのストリームを処理します。バイトストリーム入出力には、ファイルの終わりという概念がないため、ファイルの終わりを超えて読み取らないように注意する必要があります。
同じファイルに対して、バイトストリーム入出力 と COBOL 入出力を使用しないでください。例えば、CBL_OPEN_FILE を使用してファイルを開く場合は、標準の COBOL READ 文を使用してファイルから読み取ることはできません。
これらのすべてのルーチンについて、ルーチンが成功した場合は、RETURN-CODE レジスタがゼロに設定されます。ルーチンが失敗した場合は、RETURN-CODE レジストリに失敗を示すファイル状態値が含まれます。このファイル状態は、常に標準の ANSI'74 ファイル状態値です。エラーに対して ANSI'74 ファイル状態を定義しない場合は、拡張されたファイル状態が返されます (9/nnn。この nnn はランタイムシステムエラー番号です)。
そのため、RETURNING 句ではなく RETURN-CODE 句を使用する必要があります。バイトストリームルーチンを呼び出した後にRETURN-CODE がゼロ以外である場合は、ファイル状態として処理する必要があります。例えば、次のようになります。
01 file-status pic xx comp-x.
01 redefines file-status.
03 fs-byte-1 pic x.
03 fs-byte-2 cblt-x1-compx
. . .
call "CBL_xxx_FILE" using parameters
if return-code not = 0
move return-code to file-status
. . .
このポイントでは、fs-byte-1 には 9 が含まれ、fs-byte-2 にはランタイムシステムエラー番号が含まれます。
バイトストリーム操作用に開かれているファイルを閉じます。
call "CBL_CLOSE_FILE" using file-handle
file-handle cblt-x4.
file-handle |
ファイルが開かれたときに返されたファイルハンドル |
なし
STOP RUN の実行時に開かれたバイトストリームファイルは、すべて自動的に閉じます。
呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。
バイトストリーム操作用の新しいファイルを作成します。
call "CBL_CREATE_FILE" using filename
access-mode deny-mode
device
file-handle
filename pic
x(n)
access-mode cblt-x1-compx
deny-mode cblt-x1-compx
device cblt-x1-compx
file-handle cblt-x4
filename |
空白文字またはヌルで終了する、開かれるファイルのファイル名 | ||||||||
access-mode |
0 にする必要があります。 | ||||||||
deny-mode |
拒否モードを次のように定義します。
|
||||||||
device |
予約フィールド (0 にする必要があります) |
file-handle |
ファイルが正常に開いたことを示すファイルハンドルを返します。 |
呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。
ファイルのファイルバッファがすべてディスクに書き込まれているかどうかを確認します。これには、ランタイムシステムバッファとオペレーティングシステムバッファの両方が含まれます。
call "CBL_FLUSH_FILE" using file-handle
file-handle cblt-x4
file-handle |
(CBL_OPEN_FILE によって) ファイルが開かれたときに返されたファイルハンドル |
RETURN-CODE |
ルーチンが成功したかどうかを示します。
|
一部のオペレーティングシステムでは、ファイルバッファを書き出すことはできません。この場合は、適切な状態コードが返されます。
呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。
ファイルのレコードロックを解除します。
call "CBL_FREE_RECORD_LOCK" using file-handle
record-offset
record-length reserved
file-handle cblt-x4
record-offset cblt-x4-compx
record-length cblt-x4-compx
reserved cblt-x2-compx
file-handle |
CBL_OPEN_FILE または CBL_CREATE_FILE が正常に実行されると返されるファイルハンドル |
record-offset |
ファイル内でロック解除する最初のバイトのオフセット |
record-length |
ロック解除するバイト数 |
reserved |
ゼロにする必要があります。 |
RETURN-CODE |
ルーチンが成功したかどうかを示します。
|
呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。
ファイルのレコードロックを取得します。
call "CBL_GET_RECORD_LOCK" using file-handle
record-offset
record-length reserved
file-handle cblt-x4
record-offset cblt-x4-compx
record-length cblt-x4-compx
reserved cblt-x2-compx
file-handle |
CBL_OPEN_FILE または CBL_CREATE_FILE が正常に実行されると返されるファイルハンドル |
record-offset |
ファイル内のロックする最初のバイトのオフセット |
record-length |
ロックするバイト数 |
reserved |
ゼロにする必要があります。 |
RETURN-CODE |
ルーチンが成功したかどうかを示します。
|
呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。
バイトストリーム操作用の既存のファイルを開きます。
call "CBL_OPEN_FILE" using filename
access-mode deny-mode
device file-handle
filename pic
x(n).
access-mode cblt-x1-compx
deny-mode cblt-x1-compx
device cblt-x1-compx
file-handle pic
x(4).
filename |
空白文字またはヌルで終了する開かれるファイルのファイル名 | ||||||||
access-mode |
アクセスモードを次のように定義します。
|
||||||||
deny-mode |
拒否モードを次のように定義します。
|
||||||||
device |
予約フィールド (0 に設定する必要があります) |
file-handle |
ファイルが正常に開いたことを示すファイルハンドルを返します。 |
呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。
ファイルに既存のレコードロックがあるかどうかをテストします。
call "CBL_TEST_RECORD_LOCK" using file-handle
record-offset
record-length reserved
file-handle cblt-x4
record-offset cblt-x4-compx
record-length cblt-x4-compx
reserved cblt-x2-compx
file-handle |
CBL_OPEN_FILE または CBL_CREATE_FILE が正常に実行されると返されるファイルハンドル |
record-offset |
ファイル内のテストする最初のバイトのオフセット |
record-length |
テストするバイト数 |
reserved |
ゼロに設定する必要があります。 |
RETURN-CODE |
ルーチンが成功したかどうかを示します。
|
ファイルにバイトを書き込みます。
call "CBL_WRITE_FILE" using file-handle
file-offset byte-count
flags buffer
file-handle cblt-x4
file-offset cblt-x8-compx
byte-count cblt-x4-compx
flags cblt-x1-compx
buffer pic
x(n)
file-handle |
ファイルが開かれたときに返されたファイルハンドル | ||
file-offset |
書き込み時のファイルのオフセット。このフィールドは、x"00FFFFFFFF" の最大値に制限されます。 | ||
byte-count |
書き込むバイト数。このフィールドは、x"00FFFF" の最大値に制限されます。 | ||
flags |
このパラメータは、次の値を取ることができます。
|
||
buffer |
バイトが書き出されるバッファ。バッファが、書き込まれるバイト数を格納できる大きさかどうかを確認する必要があります。
buffer は、64K セグメント境界をクロスすることができます。 |
なし
呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。
次のプログラム例には、バイトストリームファイルとして処理されるファイルを開いて閉じるルーチンが含まれています。1 つは入力用で、もう 1 つは出力用です。個々のバイトは、バッファリングを使用して読み書きされます。
$SET ANS85 *==========================================================* working-storage section 78 fals value 0 78 tru value 1. *----------------------------------------------------------* * バイトストリーム処理用 WS 78 in-buff-len value 4096. 01 in-buff pic x(in-buff-len). 01 infilename pic x(64). 01 infile-handle cblt-x4. 01 infile-offset cblt-x8-compx value 0. 01 infile-len cblt-x8-compx. 01 in-buff-ptr pic x(2) comp-x. 01 in-buff-end cblt-x4 comp-x value in-buff-len.
78 out-buff-len value 4096.
01 out-buff pic x(out-buff-len).
01 outfilename pic x(64).
01 outfile-handle cblt-x4.
01 outfile-offset cblt-x8-compx value 0.
01 outfile-len cblt-x8-compx.
01 out-buff-ptr pic x(2) comp-x.
01 out-buff-end cblt-x4-compx value in-buff-len.
01 bs-misc.
03 eof-flag pic x comp-x value fals.
88 eof value tru.
03 last-block-flag pic x comp-x value fals.
88 last-block value tru.
03 display-put-flag pic x comp-x value fals.
88 display-put value tru false fals.
03 next-byte.
05 next-byte-n cblt-x1-compx
03 save-byte pic x.
01 k-0 cblt-x1-compx value 0.
01 k-1 cblt-x1-compx value 1.
01 k-2 cblt-x1-compx value 2.
01 k-128 cblt-x1-compx value 128.
*----------------------------------------------------------*
*==========================================================*
procedure division.
aa-control section.
perform ca-initial.
perform cc-process.
perform ce-final
.
aa-990-exit.
exit program
stop run
.
ca-initial section.
move "inbyte.dat" to infilename
move "outbyte.dat" to outfilename
perform open-in-file
perform open-out-file
.
cc-process section.
* 各バイトを確認し、(when 句で指定されたような)
* 対応するバイトを検出したら、要求されたように
* 処理します。
perform get-byte
perform until eof
evaluate next-byte
when .......
when other
perform put-byte
perform get-byte
end-evaluate
end-perform
.
ce-final section.
perform close-in-file
perform close-out-file
.
*----------------------------------------------------------*
* 入力バイトストリームファイル処理
open-in-file section.
call "CBL_OPEN_FILE" using infilename
k-1
k-0
k-0
infile-handle
if return-code not = 0
display "Open failed: "
infilename
stop run
end-if
* 入力ファイルの長さの検出
call "CBL_READ_FILE" using infile-handle
infile-offset
in-buff-end
k-128
in-buff
move infile-offset to infile-len
move 0 to infile-offset
move in-buff-len to in-buff-ptr
add 1 to in-buff-ptr
move fals to last-block-flag
move fals to eof-flag
.
get-byte section.
if in-buff-ptr = in-buff-end
if last-block
set eof to true
move x"ff" to next-byte
else
perform get-next-block
if in-buff-end = 0
set eof to true
move x"ff" to next-byte
end-if
end-if
end-if
if not eof
move in-buff (in-buff-ptr : 1) to next-byte
add 1 to in-buff-ptr
* 先に進まないで
* next-byte を表示する
end-if
.
get-previous-byte section.
if in-buff-ptr = 2
subtract 2 from in-buff-ptr
else
perform get-previous-block
end-if
perform get-byte
.
get-next-block section.
call "CBL_READ_FILE" using infile-handle
infile-offset
in-buff-end
k-0
in-buff
end-call
move 1 to in-buff-ptr
add in-buff-end to infile-offset
if infile-offset = infile-len
subtract infile-len from infile-offset
subtract infile-offset from in-buff-end
move tru to last-block-flag
end-if
.
get-previous-block section.
if last-block
move fals to last-block-flag
move in-buff-len to in-buff-end
add infile-len to infile-offset
end-if
subtract in-buff-end from infile-offset
call "CBL_READ_FILE" using infile-handle
infile-offset
in-buff-end
k-0
in-buff
end-call
move in-buff-len to in-buff-ptr
.
close-in-file section.
call "CBL_CLOSE_FILE" using infile-handle
.
*==========================================================*
* 出力バイトストリームファイル処理
open-out-file section.
call "CBL_CREATE_FILE" using outfilename
k-2
k-0
k-0
outfile-handle
if return-code not = 0
display "Open failed: "
outfilename
stop run
end-if
move 1 to out-buff-ptr
.
put-byte section.
if display-put
display next-byte
with no advancing
end-if
move next-byte to out-buff (out-buff-ptr:1)
add 1 to out-buff-ptr
if out-buff-ptr = out-buff-len
perform write-block
move 1 to out-buff-ptr
end-if
.
write-block section.
call "CBL_WRITE_FILE" using outfile-handle
outfile-offset
out-buff-end
k-0
out-buff
end-call
add out-buff-end to outfile-offset
.
close-out-file section.
if out-buff-ptr = 1
move out-buff-ptr to out-buff-end
subtract 1 from out-buff-end
perform write-block
end-if
call "CBL_CLOSE_FILE" using outfile-handle
.
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。
![]() |
その他のトピック | 呼び出し可能ソート API | ![]() |