前ページへ C-ISAMファイル 呼び出し可能ソート API次ページへ

第 13 章 バイトストリームファイル処理

標準の COBOL READ および WRITE 文は、ファイルの入出力操作中にフォーマットされたデータ (レコード) を処理します。また、ファイルをバイトストリームとして処理することもできます。つまり、読み取るまたは書き込むブロックの開始位置と長さを指定して、ファイル内のデータにアクセスします。この章では、ファイルにバイトストリームとしてアクセスできる COBOL システムのライブラリルーチンについて説明します。

13.1 概要

バイトストリーム入出力を使用すると、このシステムではサポートされない形式のファイルやユーザ独自の形式のファイルを処理したり、独自のファイルハンドラを書き込んだり、あるいは単純なテキストのストリームとして行順ファイルを処理することができます。


注意: COBOL 構文または呼び出し可能ファイルハンドラでサポートされる形式のファイルにアクセスする場合は、バイトストリーム入出力を使用しないでください。このような場合にバイトストリーム入出力を使用すると、ファイルが簡単に破損する可能性があります。


Infomgr を使用して参照できるプログラム例、 byteio.cbl は、これらのルーチンの使用法を示しています。この項の内容を参照しながら、このプログラム例を確認することができます。コード内では、ファイルのサイズを判断する部分と、プログラムがファイルの終わりを超えて読み取られていないかどうかを確認するために実行するチェックの部分に特に注意してください。

13.2 バイトストリームルーチン

バイトストリームルーチンは、次のとおりです。

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 文を使用してファイルから読み取ることはできません。

13.2.1 バイトストリームルーチンの概要

これらのすべてのルーチンについて、ルーチンが成功した場合は、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 にはランタイムシステムエラー番号が含まれます。

13.2.2 バイトストリームルーチンの説明


CBL_CLOSE_FILE

バイトストリーム操作用に開かれているファイルを閉じます。

構文
call "CBL_CLOSE_FILE" using      file-handle
パラメータ

file-handle         cblt-x4.

入力時
file-handle ファイルが開かれたときに返されたファイルハンドル
終了時

なし

コメント

STOP RUN の実行時に開かれたバイトストリームファイルは、すべて自動的に閉じます。

呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。


CBL_CREATE_FILE

バイトストリーム操作用の新しいファイルを作成します。

構文
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 拒否モードを次のように定義します。
0 読み書き両方を拒否 (排他)
1 書き込み拒否
2 読み取り拒否
3 読み書き両方を許可
device 予約フィールド (0 にする必要があります)
終了時
file-handle ファイルが正常に開いたことを示すファイルハンドルを返します。
コメント

呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。


CBL_FLUSH_FILE

ファイルのファイルバッファがすべてディスクに書き込まれているかどうかを確認します。これには、ランタイムシステムバッファとオペレーティングシステムバッファの両方が含まれます。

構文
call "CBL_FLUSH_FILE" using file-handle
パラメータ

file-handle         cblt-x4

入力時
file-handle (CBL_OPEN_FILE によって) ファイルが開かれたときに返されたファイルハンドル
終了時
RETURN-CODE ルーチンが成功したかどうかを示します。
0 成功
-1 バッファは書き出されていない
その他 エラーを示す 2 バイトのファイル状態コード
コメント

一部のオペレーティングシステムでは、ファイルバッファを書き出すことはできません。この場合は、適切な状態コードが返されます。

呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。


CBL_FREE_RECORD_LOCK

ファイルのレコードロックを解除します。

構文
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 ルーチンが成功したかどうかを示します。
0 成功
9/nnn エラー状況を示すファイル状態
コメント

呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。


CBL_GET_RECORD_LOCK

ファイルのレコードロックを取得します。

構文
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 ルーチンが成功したかどうかを示します。
0 成功
1 実行ユニットによってすでに所有されているロック
9/nnn エラー状況を示すファイル状態
コメント

呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。


CBL_OPEN_FILE

バイトストリーム操作用の既存のファイルを開きます。

構文
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 アクセスモードを次のように定義します。
1 読み取りのみ
2 書き込みのみ (拒否モードは 0 にする必要があります)
3 読み書き
deny-mode 拒否モードを次のように定義します。
0 読み書きの両方を拒否 (排他)
1 書き込みを拒否
2 読み取りを拒否
3 読み書きの両方を許可
device 予約フィールド (0 に設定する必要があります)
終了時
file-handle ファイルが正常に開いたことを示すファイルハンドルを返します。
コメント

呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。


CBL_TEST_RECORD_LOCK

ファイルに既存のレコードロックがあるかどうかをテストします。

構文
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 ルーチンが成功したかどうかを示します。
0 成功
1 すでに実行ユニットによって所有されているロック
9/nnn エラー状況を示すファイル状態

CBL_WRITE_FILE

ファイルにバイトを書き込みます。

構文
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 このパラメータは、次の値を取ることができます。
0 標準書き込み
buffer バイトが書き出されるバッファ。バッファが、書き込まれるバイト数を格納できる大きさかどうかを確認する必要があります。

buffer は、64K セグメント境界をクロスすることができます。

終了時

なし

コメント

呼び出しが成功したかどうかは、RETURN-CODE を確認してチェックできます。詳細については、『バイトストリームルーチンの概要』を参照してください。


13.3 プログラム例

次のプログラム例には、バイトストリームファイルとして処理されるファイルを開いて閉じるルーチンが含まれています。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.
本書、ならびに使用されている固有の商標と商品名は国際法で保護されています。

前ページへ C-ISAMファイル 呼び出し可能ソート API次ページへ