標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
Language Environment | 両方 |
#include <stdio.h>
int flocate(FILE *stream, const void *key, size_t key_len, int options);
#define _OPEN_SYS_UNLOCKED_EXT 1
#include <stdio.h>
int flocate_unlocked(FILE *stream, const void *key, size_t key_len, int options);
stream によって指し示されるストリームに関連する VSAM ファイル位置標識を、指定された残りの引数に従って移動します。
ユーザーのネーム・スペースが侵害されるのを回避するため、この非標準関数には 2 つの名前があります。1 つの名前の接頭部には 2 つの下線文字が付き、もう 1 つの名前の接頭部には付きません。接頭部下線文字が付いていない名前は、LANGLVL(EXTENDED) を使用する場合にのみ表示されます。
この関数を使用するには、その外部エントリー・ポイント名 (2 つの下線文字で始まる名前) を使用して呼び出すか、LANGLVL(EXTENDED) を使用してコンパイルする必要があります。LANGLVL(EXTENDED) を使用すると、ヘッダー内の関連情報も表示されます。
key は、位置付けに使用されるキーを指します。
options は、表 1 で説明する位置オプションを指定します。
__KEY_FIRST | ファイル内の最初のレコードに位置付ける。以降の読み取りは前方向に行われる。key と key_len は無視される。 |
---|---|
__KEY_LAST | ファイル内の最後のレコードに位置付ける。以降の読み取りは逆方向順に行われる。key と key_len は無視される。 レコード・モードでオープンされた VSAM ファイルにのみ適用される。 |
__KEY_EQ | 指定されたキーを持つ最初のレコードに位置付ける。以降の読み取りは前方向に行われる。 |
__KEY_EQ_BWD | 指定されたキーを持つ最初のレコードに位置付ける。以降の読み取りは逆方向順に行われる。このオプションを使用するには、完全キー検索が必要です。key_len は、データ・セットに対して定義されたものと同じキー長でなければなりません。 レコード・モードでオープンされた VSAM ファイルにのみ適用される。 |
__KEY_GE | 指定されたキー以上のキーを持つ最初のレコードに位置付ける。 |
__RBA_EQ | 指定された RBA のレコードに位置付ける。以降の読み取りは前方向に行われる。 代替索引パスで __RBA_EQ を使用することはできない。 RRDS にこのオプションを使用することはお勧めしません。基礎的な VSAM ユーティリティーでは、RRDS ファイル内での RBA のシークはサポートしない。flocate() 関数は、ファイルの LRECL で値を除算し、同等 の __KEY_EQ を使用することにより、RBA を相対レコード番号に変換 しようとする。 このオプションを KSDS に使用することはお勧めしません。任意のレコードの RBA は、別のレコードの挿入、削除、または更新によって、変わっていく可能性があるからです。 |
__RBA_EQ_BWD | 指定された RBA のレコードに位置付ける。以降の読み取りは逆方向順に行われる。 代替索引パスで __RBA_EQ_BWD を使用することはできない。 RRDS にこのオプションを使用することはお勧めしません。基礎的な VSAM ユーティリティーでは、RRDS ファイル内での RBA のシークはサポートしない。flocate() 関数は、ファイルの LRECL で値を除算し、同等 の __KEY_EQ_BWD を使用することにより、RBA を相対レコード番号に 変換しようとする。 このオプションを KSDS に使用することはお勧めしません。任意のレコードの RBA は、別のレコードの挿入、削除、または更新によって、変わっていく可能性があるからです。 レコード・モードでオープンされた VSAM ファイルにのみ適用される。 |
_KEY_EQ_BWD | 指定されたキーを持つ最初のレコードに位置付ける。以降の読み取りは逆方向順に行われる。 このオプションを使用するには、完全キー検索が必要です。key_len は、データ・セットに対して定義されたものと同じキー長に設定する必要があります。 レコード・モードでオープンされた VSAM ファイルにのみ適用される。 |
flocate_unlocked() は、スレッド・セーフでないことを除いて、機能的に flocate() と 等価です。この関数をマルチスレッドのアプリケーション内で安全に使用できるのは、 flockfile() 関数または ftrylockfile() 関数のどちらかへの呼び出しが成功した後のように、 呼び出しスレッドが (FILE*) オブジェクトを所有している間に、この関数を呼び出す場合だけです。
VSAM 拡張アドレッシング機能のデータ・セットの考慮事項: flocate() は、相対バイト・アドレス (RBA) 値が位置決めに使用される場合、4 または 8 のキー長を受け入れます。キー長を 8 にする必要があるのは、VSAM 拡張アドレッシング機能のデータ・セットで作業をする場合のみです。これは、このアドレスが 4 GB を超えた場合、その数値を収容するのに十分な大きさのキーが必要となるからです。
値 4 GB-1 を flocate() のキーとして使用する場合、キー長は 8 で、使用されるデータ型のサイズが 8 バイトである必要があります (例えば、X' 00000000FFFFFFFF')。キー長が 4 の場合、flocate() はそのキーを -1(EOF) として扱います。
正常に実行された場合、flocate() は 0 を戻します。
レコードが見つからなかったか、または位置が EOF を超えている場合は、flocate() は EOF を戻します。
#include <stdio.h>
int main(void)
{
FILE *stream;
int vsam_rc;
char *key = "RECORD 27";
stream = fopen("DD:MYCLUS", "rb+,type=record");
vsam_rc = flocate(stream, key, 9, __KEY_EQ);
⋮
}