_Rreadk () -按键读取记录

格式

#include <recio.h>

_RIOFB_T *_Rreadk(_RFILE *fp, void *buf, size_t size,
                   int opts, void *key, unsigned int keylen);

语言级别

ILE C 扩展

线程安全

但是,如果文件指针在线程之间传递,那么 I/O 反馈区域将在这些线程之间共享。

描述

_Rreadk() 函数读取当前用于与 fp关联的文件的键控访问路径中的记录。 最多可将 size 字节数从记录复制到 buf (仅移动方式)。 如果打开该文件以进行更新,那么除非指定 __NO_LOCK ,否则 _Rreadk() 函数将锁定定位为 __NO_LOCK 的记录。 必须使用键控序列路径来处理文件。

以下参数对 _Rreadk() 函数有效。
buf
指向要存储所读取数据的缓冲区。 如果使用了定位方式,那么此参数必须设置为 NULL。
大小
指定要读取并存储在 buf中的字节数。 如果使用了定位方式,那么将忽略此参数。
指向要用于读取的密钥。
keylen
指定要使用的密钥的总长度。
选项
指定文件的处理选项。 可能的值包括:
__DFT
缺省为 __KEY_EQ。
__KEY_EQ
定位并读取具有指定键的第一条记录。
__KEY_GE
定位并读取具有大于或等于指定键的键的第一个记录。
__KEY_GT
定位并读取具有大于指定键的键的第一条记录。
__KEY_LE
定位并读取具有小于或等于指定键的键的第一个记录。
__KEY_LT
定位并读取具有小于指定键的键的第一个记录。
__键_NEXTEQ
定位并读取下一条记录,该记录的键等于当前位置的键值。 将忽略 key 参数。
__键_NEXTUNQ
使用唯一键从访问路径中的当前位置定位并读取下一条记录。 将忽略 key 参数。
_KEY_PREVEQ
将键与当前位置的键值相等的最后一条记录放置并读取。 将忽略 key 参数。
__KEY_PREVUNQ
使用唯一键从访问路径中的当前位置定位到先前记录并读取先前记录。 将忽略 key 参数。
__NO_LOCK(无锁
请勿锁定记录以进行更新。

定位选项是互斥的。

以下选项可以使用按位 OR (|) 运算符与定位选项组合。
__KEY_NULL_MAP
按键读取记录时,将考虑 NULL 键映射。
__NO_LOCK(无锁
将不会锁定定位的记录。

_Rreadk() 函数对数据库和 DDM 文件有效。

返回值

_Rreadk() 函数返回指向与 fp关联的 _RIOFB_T 结构的指针。 如果 _Rreadk() 操作成功,那么 num_bytes 字段将设置为从系统缓冲区传输到用户缓冲区的字节数 (移动方式) 或文件的记录长度 (定位方式)。 将更新 keyrrn 字段。 如果指定了部分键,那么键字段将始终包含完整键。 将记录分块与 _Rreadk()配合使用时,仅将一个记录读取到该块中。 因此,块中剩余零条记录,并且 _RIOFB_T 结构的 blk_count 字段将使用 0 进行更新。 blk_filled_by 字段不适用于 _Rreadk() 并且不会更新。 如果找不到 key 指定的记录,那么 num_bytes 字段将设置为零或 EOF。 如果要通过部分键读取记录,那么将在反馈结构中返回整个键。 如果不成功,那么 num_bytes 字段将设置为小于 size 的值,并且将更改 errno。

errno 的值可以设置为:
含义
EBADKEYLN
指定的密钥长度无效。
阅读
未打开该文件以执行读操作。
ETRUNC
在 I/O 操作上发生截断。
EIOERROR
发生了不可恢复的I/O错误。
EIORECERR
发生了可恢复的I/O错误。
请参阅 表 1表 1 以获取 errno 设置。

示例

#include <stdio.h>
#include <recio.h>
#include <stdlib.h>
 
int main(void)
{
    _RFILE   *fp;
    _RIOFB_T *fb;
    char      buf[4];
    /* Create a physical file                                        */
    system("CRTPF FILE(QTEMP/MY_FILE)");
    /* Open the file for write                                       */
    if ( (fp = _Ropen("QTEMP/MY_FILE", "wr")) == NULL )
    {
        printf("open for write fails\n");
        exit(1);
    }
    /* write some records into the file                              */
    _Rwrite(fp, "KEY9", 4);
    _Rwrite(fp, "KEY8", 4);
    _Rwrite(fp, "KEY7", 4);
    _Rwrite(fp, "KEY6", 4);
    _Rwrite(fp, "KEY5", 4);
    _Rwrite(fp, "KEY4", 4);
    _Rwrite(fp, "KEY3", 4);
    _Rwrite(fp, "KEY2", 4);
    _Rwrite(fp, "KEY1", 4);
    /* Close the file                                                */
    _Rclose(fp);
    /* Open the file for read                                        */
    if ( (fp = _Ropen("QTEMP/MY_FILE", "rr")) == NULL )
    {
        printf("open for read fails\n");
        exit(2);
    }
    /* Read the record with key KEY3                                 */
    fb = _Rreadk(fp, buf, 4, __KEY_EQ, "KEY3", 4);
    printf("record %d with value %4.4s\n", fb->rrn, buf);
    /* Read the next record with key less than KEY3                  */
    fb = _Rreadk(fp, buf, 4, __KEY_LT, "KEY3", 4);
    printf("record %d with value %4.4s\n", fb->rrn, buf);
    /* Read the next record with key greater than KEY3               */
    fb = _Rreadk(fp, buf, 4, __KEY_GT, "KEY3", 4);
    printf("record %d with value %4.4s\n", fb->rrn, buf);
    /* Read the next record with different key                       */
    fb = _Rreadk(fp, buf, 4, __KEY_NEXTUNQ, "", 4);
    printf("record %d with value %4.4s\n", fb->rrn, buf);
    /* Close the file                                                */
    _Rclose(fp);
}

相关信息