日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:入出力について
第 3 章:文字/文字列/引数リスト関数
第 4 章:エラー処理とシグナル処理
第 5 章:サブプロセス関数
第 6 章:Curses画面管理関数とマクロ
第 7 章:算術関数
第 8 章:メモリ割り当て関数
第 9 章:システム関数
第 10 章:国際化ソフトウェアの開発
第 11 章:日付/時刻関数
第 12 章:シンボリックリンクとPOSIXパス名
付録 A:各OSバージョンでサポートする関数一覧
付録 B:非標準ヘッダに複製されているプロトタイプ
索引
PDF
OpenVMS ホーム

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


目次 索引



標準 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,ストリーム・ファイル・フォーマットのレコードの長さは,最大サイズまでの範囲で変化することができ,最大サイズはファイルの作成時に指定しなければなりません。可変長レコードまたは 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 



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

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

レコード・ファイルへのレコード・アクセスは, 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 は次のいずれかの方法を使用して,レコードのキャリッジ制御情報を変換します。

  • レコード属性が暗黙のキャリッジ制御 (RAT = CR) の場合, HP C RTL は改行文字をレコードの末尾に追加します。
    この改行文字はレコードの一部であると解釈されます。したがって,たとえば fgetc関数を使用して取得することができ, fgets関数では行区切り文字として解釈されます。 fgetsは改行文字までファイルを読み込むため, RAT=CR のファイルの場合,この関数はレコード境界をまたがる文字列を検索することができません。

  • レコード属性がプリント・キャリッジ制御 (RAT = PRN) の場合は, HP C RTL はレコードを拡張し,レコードの前後にある先頭と末尾のキャリッジ制御を結合します。
    この変換は,RMS で指定されている規則に従って行われます。ただし,1 つの例外があります。接頭文字が x01 で接尾文字が x8D の場合,レコードの先頭には何も付加されず,レコードの末尾には 1 つの改行文字が付加されます。このような処理が行われるのは,この接頭文字/接尾文字の組み合わせが,通常は行を表現するために使用されるからです。

  • レコード属性が Fortran キャリッジ制御 (fRAT = FTN) の場合は, HP C RTL は最初の制御バイトを削除し, RMS の定義に従ってデータの前後に適切なキャリッジ制御文字を付加します。ただし,スペースおよびデフォルトのキャリッジ制御文字は例外です。これらの文字は行を表現するために使用されるので, HP C RTL はデータに 1 つの改行文字を付加します。
    Fortran キャリッジ制御のマッピングは, "ctx=nocvt" を使用することで無効に設定することができます。

  • レコード属性がヌル (RAT = NONE) で,入力が端末から取り込まれる場合は, HP C RTL は区切り文字をレコードに追加します。区切り文字がキャリッジ・リターンまたは Ctrl/Z の場合は, HP C はその文字を改行文字 (\n) に変換します。
    入力が端末以外のファイルから取り込まれる場合は, HP C RTL はレコードを変更せずにそのままプログラムに渡し,接頭文字や接尾文字は付加しません。

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

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

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

  • どのファイルの場合も,出力されるバイト数が HP C RTL で割り振られた内部バッファより大きい場合は,レコードが出力されます。

  • 固定長レコード (RFM = FIX) のファイルや, "ctx=bin" または "ctx=xplct" を指定してオープンされたファイルの場合は,レコードは内部バッファが満杯になるか,または flush関数が呼び出された場合にだけ出力されます。

  • STREAM_CR レコード・フォーマット (RFM = STMCR) のファイルの場合は, HP C RTL は,キャリッジ・リターン文字 (\r) を検出したときにレコードを出力します。

  • STREAM レコード・フォーマット (RFM = STM) のファイルの場合は, HP C RTL は改行 (\n),改ページ (\f),垂直タブ (\v) 文字を検出したときにレコードを出力します。

  • 他のすべてのファイル・タイプの場合, HP C RTL は改行文字 (\n) を検出したときにレコードを出力します。

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

  • レコード属性がキャリッジ制御 (R AT = CR) で,論理レコードが改行文字 (\n) で終了する場合は, HP C RTL は改行文字を削除し,暗黙のキャリッジ制御を付けて論理レコードを書き込みます。

  • レコード属性がプリント・キャリッジ制御 (RAT = PRN) の場合は, HP C RTL は RMS で指定されている規則に従ってプリント・キャリッジ制御を付けてレコードに書き込みます。論理レコードが 1 文字の改行文字 (\n) で終了する場合は,改行文字を x01 接頭文字および x8D 接尾文字に変換します。これは,プリント・キャリッジ制御属性の付いたレコード・ファイルを入力する場合と逆の変換です。

  • レコード属性が Fortran キャリッジ制御 (RAT = FTN) の場合は, HP C RTL は先頭および末尾のキャリッジ制御文字を削除し, RMS の定義に従ってレコードの先頭に 1 バイトのキャリッジ制御バイトを付加します。ただし,1 つの例外があります。出力レコードが改行文字 (\n) で終了する場合は, HP C RTL は改行文字を削除し,スペース・キャリッジ制御バイトを使用します。これは,Fortran キャリッジ制御属性を持つレコード・ファイルを入力する場合の逆の変換です。
    Fortran キャリッジ制御の変換は, "ctx=nocvt" を使用することで無効に設定することができます。

  • 論理レコードが端末デバイスに書き込まれ,レコードの最後の文字が改行文字 (\n) の場合は, HP C RTL は改行文字をキャリッジ・リターン (\r) に置き換え,レコードの先頭に改行文字 (\n) を付加します。その後, HP C RTL はキャリッジ制御を付けずにレコードを書き込みます。

  • 出力されるファイル・レコード・フォーマットが固定長制御部付可変長 (RFM = VFC) で,レコード属性にプリント・キャリッジ制御が含まれてない (RAT が PRN でない) 場合は, 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 ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項