_Rreads () -同じレコードの読み取り

形式

#include <recio.h>

_RIOFB_T *_Rreads(_RFILE *fp, void *buf, size_t size, int opts);

言語レベル

ILE C Extension

スレッド・セーフ

はい

ただし、スレッド間でファイル・ポインターが渡された場合、入出力フィードバック域はそれらのスレッド間で共有されます。

説明

_Rreads() 関数は、 fpに関連したファイルに現在使用されているアクセス・パス内の現行レコードを読み取ります。 アクセス・パスは、キー・シーケンスまたは到着順です。 最大で size のバイト数が、レコードから buf にコピーされます (移動モードのみ)。 ファイルが更新用にオープンされている場合、__NO_LOCK が指定されていない限り、 _Rreads() 関数は位置指定されたレコードをロックします。

fp に関連するファイル内の現在位置にレコードが関連付けられていない場合、 _Rreads() 関数は失敗します。

_Rreads() 関数は、ファイルがレコード・ブロック化のためにオープンされている場合は無効です。

以下は、 _Rreads() 関数の有効なパラメーターです。
バッファー
読み取ったデータを保管するバッファーを指定します。 位置指定モードを使用する場合、このパラメーターは NULL に設定する必要があります。
サイズ
読み取って buf に保管するバイト数を指定します。 位置指定モードを使用する場合、このパラメーターは無視されます。
オプション
ファイルの処理オプションを指定します。 使用できる値は次の通りです。
__DFT
ファイルが更新用にオープンしている場合、読み取り中または位置指定中のレコードはロックされます。 以前にロックしたレコードは、以後ロックされなくなります。
__NO_LOCK
位置指定されているレコードをロックしません。

_Rreads() 関数は、データベースおよび DDM ファイルに対して有効です。

戻り値

_Rreads() 関数は、 fpに関連した _RIOFB_T 構造体へのポインターを戻します。 _Rreads() 操作が正常に行われると、num_bytes フィールドは、システム・バッファーからユーザーのバッファーに転送されたバイト数 (移動モード) またはファイルのレコード長 (位置指定モード) に設定されます。 key および rrn フィールドも更新されます。 これが正常終了しなかった場合、num_bytes フィールドは、size より小さい値に設定され、errno が変更されます。

errno の値は、次のいずれかに設定されます。
意味
ENOTREAD
ファイルは読み取り操作用にオープンされていません。
ETRUNC
入出力操作で切り捨てが発生しました。
EIOERROR
回復不能入出力エラーが起こりました。
EIORECERR
回復可能入出力エラーが起こりました。
errnoの設定については、 表1 および表1を参照のこと。

#include <stdlib.h>
#include <recio.h>
 
int main(void)
{
    _RFILE      *fp;
    _XXOPFB_T   *opfb;
 
    /* Open the file for processing in arrival sequence.             */
    if (( fp = _Ropen ( "MYLIB/T1677RD1", "rr+, arrseq=Y" )) == NULL )
    {
        printf ( "Open failed\n" );
        exit ( 1 );
    }
 
    /* Get the library and file names of the file opened.            */
    opfb = _Ropnfbk ( fp );
    printf ( "Library: %10.10s\nFile:    %10.10s\n",
              opfb->library_name,
              opfb->file_name);
 
    /* Get the last record.                                          */
    _Rreadl ( fp, NULL, 20, __DFT );
    printf ( "Last record: %10.10s\n", *(fp->in_buf) );
 
    /* Get the same record without locking it.                       */
    _Rreads ( fp, NULL, 20, __NO_LOCK);
    printf ( "Same record: %10.10s\n", *(fp->in_buf) );
 
    _Rclose ( fp );
}

関連情報