_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 欄位會設為從系統緩衝區傳送至使用者緩衝區 (移動模式) 的位元組數,或檔案的記錄長度 (尋找模式)。 將更新 key 和 rrn 欄位。 如果指定部分索引鍵,則索引鍵欄位將一律包含完整索引鍵。 搭配使用記錄區塊處理與 _Rreadk()時,只會將一筆記錄讀取至區塊處理。 因此,區塊中剩餘零筆記錄,且 _RIOFB_T 結構的 blk_count 欄位將更新為 0。 blk_filled_by 欄位不適用於 _Rreadk() ,且不會更新。 如果找不到 key 指定的記錄,則 num_bytes 欄位會設為零或 EOF。 如果您是依局部索引鍵來讀取記錄,則會在回饋結構中傳回整個索引鍵。 如果不成功,則 num_bytes 欄位會設為小於 size 的值,並將變更錯誤碼。
範例
#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);
}