library home hp.com home products and services support and drivers solutions
cd-rom home
End of Jump to page title
HP OpenVMS Systems
Documentation

Jump to content


HP OpenVMS

HP OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引


1.8.1 RMS のレコード・フォーマットとファイル・フォーマット

標準 I/O および UNIX I/O の関数とマクロの機能および制約事項を理解するには, OpenVMS RMS (Record Management Services) について理解する必要があります。

RMS では次のファイル編成がサポートされます。

順編成ファイルにはレコードが連続的に記録され,レコードとレコードの間に空のレコードは存在しません。相対編成ファイルには固定長のセルが記録され,各セルにはレコードが格納されていることも,格納されていないこともあります。索引順編成ファイルには,データ,キャリッジ制御情報,さまざまなアクセス順序を可能にするキーを格納したレコードが記録されます。

HP C RTL の関数は順編成ファイルにだけアクセスできます。他のファイル編成を使用する場合は,RMS 関数を使用する必要があります。 RMS 関数の詳細については,『HP C User's Guide for OpenVMS Systems』を参照してください。

RMS はレコードの内容を考慮せず,レコードのフォーマットを考慮します。レコードのフォーマットとは,記憶媒体の記録面にレコードが物理的に記録される方法です。

RMS では次のレコード・フォーマットがサポートされます。

固定長レコード・フォーマットはファイルの作成時に指定できます。このフォーマットでは,すべてのレコードがファイル内で同じサイズの領域を使用します。ファイルの作成後にレコード・フォーマットを変更することはできません。

可変長,VFC,ストリーム・ファイル・フォーマットのレコードの長さは,最大サイズまでの範囲で変化することができ,最大サイズはファイルの作成時に指定しなければなりません。可変長レコードまたは VFC フォーマットのファイルでは,レコードのサイズはデータ・レコードの先頭にあるヘッダ・セクションに格納されます。ストリーム・ファイルでは,キャリッジ制御文字やライン・フィード文字など,特定の文字が検出されたときに,RMS はレコードを終了します。ストリーム・ファイルはテキストを格納するのに便利です。

RMS では,ファイル内のレコードのキャリッジ制御属性を指定できます。このような属性としては,暗黙のキャリッジ・リターンや Fortran でフォーマットされたレコードがあります。ファイルを端末やライン・プリンタ,他のデバイスに出力するときに, RMS はこれらのキャリッジ制御を解釈します。キャリッジ制御情報はデータ・レコードに格納されません。

デフォルト設定では,ファイルの前のバージョンが存在する場合,ファイルは RMS レコード・フォーマット,最大レコード・サイズ,レコード属性を前のバージョンから継承します。 OpenVMS システム・プログラマの場合,継承された属性は FAB$B_RFM,FAB$W_MRS,FAB$B_RAT と呼びます。前のバージョンが存在しない場合,新たに作成されたファイルのデフォルトはストリーム・フォーマットになり,レコードの終端はライン・フィード・レコード区切り文字および暗黙のキャリッジ・リターン属性で決定されます ( 本書では,この種のファイルをストリーム・ファイルと呼びます )。ストリーム・ファイルは, HP C RTL の標準 I/O および UNIX I/O 関数を使用して操作することができます。これらのファイルや,キャリッジ制御を含まない固定長レコード・ファイルを使用する場合, fseek関数や lseek関数を使用して,ファイルのランダムなバイトまでシークする機能に制限はありません。しかし,可変長レコード・フォーマットなど,ファイルに他の RMS レコード・フォーマットのいずれかが含まれる場合は, RMS の制限により,これらの関数はレコード境界までしかシークできません。他の VAX 言語やユーティリティで使用するファイルを作成またはアクセスしなければならない場合を除き,デフォルトの VAX ストリーム・フォーマットを使用してください。

1.8.2 RMS ファイルへのアクセス

RMS の順編成ファイルはレコード・モードまたはストリーム・モードでオープンすることができます。デフォルト設定では,STREAM_LF ファイルはストリーム・モードでオープンされます。他のすべてのファイル・タイプはレコード・モードでオープンされます。ファイルをオープンするときに,省略可能な引数 "ctx=rec" を指定することで,これらのデフォルト設定をレコード・モードに変更したり, "ctx=stm" を指定することでストリーム・モードに設定することができます。 RMS の相対編成ファイルと索引順編成ファイルは常にレコード・モードでオープンされます。アクセス・モードによって, HP C RTL でのさまざまな I/O 関数の動作が決定されます。

RMS で定義されているファイル・タイプの 1 つに, RMS-11 ストリーム・フォーマット・ファイルがあります。このファイル・タイプは,レコード・フォーマットの FAB$C_STM の値に対応します。このフォーマットは,SYS$GET が各レコードから先頭のヌル・バイトを削除する RMS レコード操作として定義されています。このファイル・タイプは HP C RTL によってレコード・モードで処理されるため,明示的に "ctx=stm" を指定してオープンしない限り,バイナリ・データのファイル・フォーマットとしては不適切です。 "ctx=stm" を指定した場合は,ファイルのデータ・バイトがそのまま返されます。

注意

OpenVMS Version 7.0 で,ストリーム・ファイルの LRL のデフォルト値は 0 から 32767 に変更されました。この変更により,ソートなどの特定のファイル操作で性能が著しく低下しました。

しかし,この問題は回避することができます。 HP C RTL では,論理名 DECC$DEFAULT_LRL を定義することで,ストリーム・ファイルのレコード長のデフォルト値を変更できるようになりました。

HP C RTL は最初にこの論理名を検索します。この論理名が検索され,0〜32767 の範囲の数値に変換されると,その値がデフォルト LRL として使用されます。

OpenVMS Version 7.0 より前の動作に戻すには,次のコマンドを入力します。


$ DEFINE DECC$DEFAULT_LRL 0 

1.8.2.1 ストリーム・モードでの RMS ファイルへのアクセス

RMS ファイルへのストリーム・アクセスは, RMS のブロック I/O 機能を使用して実行されます。 RMS ファイルからのストリーム入力は,ディスクに格納されているファイルの各バイトをプログラムに渡すことにより実行されます。 RMS ファイルへのストリーム出力は,プログラムからファイルに各バイトを渡すことにより実行されます。 HP C RTL はデータに対して特殊な処理を何も実行しません。

ファイルをストリーム・モードでオープンすると, HP C RTL は大きな内部バッファ領域を割り当てます。データは単一読み込みを使用してファイルからバッファ領域に読み込まれ,必要に応じてプログラムに渡されます。内部バッファが満杯になるか,または fflush関数が呼び出されると,データはファイルに書き込まれます。

1.8.2.2 レコード・モードでの RMS レコード・ファイルへのアクセス

レコード・ファイルへのレコード・アクセスは, RMS のレコード I/O 機能を使用して実行されます。 HP C RTL は,レコードの読み込み処理と書き込み処理でキャリッジ制御文字を変換することにより,バイト・ストリームをエミュレートします。すべてのレコード・ファイルに対してランダム・アクセスが可能ですが, VFC ファイル,可変長レコード・ファイル,ヌル以外のキャリッジ制御付きファイルの場合,位置設定 ( fseekおよび lseek) はレコード境界で行う必要があります。レコード・ファイルの位置設定を行うと,バッファに格納されているすべての入力が破棄され,バッファに格納されている出力はファイルに書き込まれます。

RMS レコード・ファイルからのレコード入力は,次の 2 つのステップで HP C RTL によってエミュレートされます。

  1. HP C RTL はファイルから論理レコードを読み込みます。
    レコード・フォーマットが固定長制御部付可変長 (RFM = VFC) で,レコード属性がプリント・キャリッジ制御でない (RAT が PRN でない) 場合は, HP C RTL は固定長制御領域をレコードの先頭に結合します。

  2. HP C RTL はレコードのキャリッジ制御情報 (そのような情報がある場合) を変換することにより,レコードを拡張してバイト・ストリームをシミュレートします。

RMS の用語で表現すると, HP C RTL は次のいずれかの方法を使用して,レコードのキャリッジ制御情報を変換します。

ファイルから読み込む場合, HP C RTL は変換から作成されたバイト・ストリームを渡します。 1 回の関数呼び出しで拡張されたレコードから読み込まれなかった情報は,次回の入力関数呼び出しで渡されます。

HP C RTL は RMS レコード・ファイルに対するレコード出力を次の 2 つのステップで実行します。

レコード出力エミュレーションの最初の部分は,論理レコードの作成です。データ・バイトをレコード・ファイルに書き込む場合,エミュレータは書き込む情報からレコード境界を調べます。バイト・ストリームでの情報の処理は,次に示すように,出力先のファイルやデバイスの属性に応じて異なります。

レコード出力エミュレーションの 2 番目の部分では,最初のステップで作成した論理レコードを書き込みます。 HP C RTL は出力レコードを次のように作成します。

1.8.2.2.1 レコード・モードでの可変長または VFC レコード・ファイルへのアクセス

レコード・モードで可変長または VFC レコード・ファイルにアクセスする場合,多くの I/O 関数がストリーム・モードの場合と異なる動作をします。ここでは,これらの相違点について説明します。

一般に,どのレコード・モードでも改行文字 (\n) がレコード区切り文字として使用されます。出力時には,改行文字が検出されると,改行の解釈に影響を与える省略可能な引数 (たとえば "ctx=bin" や "ctx=xplct" など) を指定していない限り,レコードが作成されます。

read関数と decc$record_read関数は常に最大 1 つのレコードを読み込みます。 write関数と decc$record_write関数は常に少なくとも 1 つのレコードを作成します。

decc$record_read関数は read関数に対応し, decc$record_write関数は write関数に対応します。ただし,これらの関数はファイル記述子ではなく,ファイル・ポインタを操作する点が異なります。

read関数は最大 1 つのレコードを読み込みますが, fread関数では複数のレコードにわたる読み込みが可能です。 fread関数は,number_items によって指定される数のレコードを読み込むのではなく (number_itemsfreadの 3 番目のパラメータ), number_items x size_of_item に等しいバイト数を読み込もうとします (size_of_itemfreadの 2 番目のパラメータ)。 freadから返される値は,読み込んだバイト数を size_of_item で除算した値に等しくなります。

fwrite関数は常に少なくとも number_items で指定される数のレコードを作成します。

fgets関数と gets関数は改行文字またはレコード境界まで読み込みます。

バッファに書き込まなければならないデータがある場合, fflush関数は常にレコードを生成します。 closefclosefseeklseekrewindfsetposの場合も同様で,これらの関数はすべて,暗黙に fflush関数を実行します。

最大レコード・サイズに指定されている文字より多くの文字を書き込もうとした場合も,レコードが生成されます。

これらの関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。


前へ 次へ 目次 索引