_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相關聯之檔案的記錄。 最多可以將 大小 個位元組從記錄複製到 buf (僅限移動模式)。 如果開啟檔案進行更新,除非指定 __NO_LOCK ,否則 _Rreadk() 函數會鎖定記錄所定位的目標。 您必須使用索引順序路徑來處理檔案。

下列參數適用於 _Rreadk() 函數。
buf
指向要儲存所讀取資料的緩衝區。 如果使用尋找模式,則此參數必須設為 NULL。
大小
指定要讀取並儲存在 buf中的位元組數。 如果使用尋找模式,則會忽略此參數。
索引鍵
指向要用於讀取的索引鍵。
keylen
指定要使用之金鑰的總長度。
opts
指定檔案的處理選項。 可能的值為:
__DFT
預設為 __KEY_EQ。
__KEY_EQ
將位置定位至並讀取具有指定索引鍵的第一筆記錄。
__KEY_GE
定位並讀取第一個鍵大於或等於指定鍵的記錄。
__KEY_GT
定位並讀取第一個鍵值大於指定鍵值的記錄。
__KEY_LE
將位置定位至並讀取索引鍵小於或等於指定索引鍵的第一筆記錄。
__KEY_LT
將位置定位至並讀取第一個索引鍵小於指定索引鍵的記錄。
__KEY_NEXTEQ
定位至並讀取下一筆記錄,其索引鍵等於現行位置上的索引鍵值。 系統不處理 key 參數。
__KEY_NEXTUNQ
從存取路徑中的現行位置,定位至並讀取具有唯一索引鍵的下一筆記錄。 系統不處理 key 參數。
__KEY_PREVEQ
將索引鍵與現行位置的索引鍵值相等的最後一筆記錄定位及讀取。 系統不處理 key 參數。
__KEY_PREVUNQ
從存取路徑中的現行位置,以唯一索引鍵來定位及讀取前一筆記錄。 系統不處理 key 參數。
__NO_LOCK
請勿鎖定記錄以進行更新。

定位選項互斥。

下列選項可與使用位元 OR (|) 運算子的定位選項結合。
__KEY_NULL_MAP
依索引鍵讀取記錄時,會考量空值索引鍵對映。
__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 的值,並將變更錯誤碼。

錯誤碼的值可以設為:
Value
意義
EBADKEYLN
指定的金鑰長度無效。
ENOTREAD
未開啟檔案進行讀取作業。
ETRUNC
I/O 作業發生截斷。
EIOERROR
發生非可回復I/O錯誤。
EIORECERR
發生可回復I/O錯誤。
如需錯誤碼設定,請參閱 表 1表 1

範例

#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);
}

相關資訊