<FD entry name> : 將在文件APIs命令中使用
<fileName> : 在服務器中被”cicssdt“創建的文件名稱
<fieldName> : 指定FD使用哪個域作為索引
<serverName>: 管理指定文件的服務器名稱。
此處使用第一節中創建的file1作為例子,命令如下:
#cicsadd -c fd -r RGN1 myFile RSLKey=public BaseName=file1 IndexName=id
FileServer=”/.:/cics/sfs/OceanLinux64″
需要冷啟動region或者”-B“選項來更新運行時數據庫。
參閱:
b.定義用於裝載數據的結構體
記錄類似於表中的行一樣存儲在文件中。我們最好為文件準備一個相同結構的結構體。例如,file1包含有id、名稱和年齡三個不同的域,所以結構體也應該以相同的大小包含這三種域/變量。
例如:
struct FileRecord {
char id[3];
char name[10]
char age[3]
} record;
還記得我們之前創建的域的類型嗎?是byteArray。為了確保域的大小是相同的並且可以靈活編程,我們使用字符集合來存儲數據。如果域的數量、大小或類型不同,相應地改變結構體進行匹配。
我們推薦在將數據存入前,把所有域的值通過”memset“函數設定為‘\0’。例如:memset(record.name,’\0′,10)。
現在可以在結構體實例中存儲記錄了。
(2)讀取記錄
通過使用READ命令,用戶可以將文件中的指定記錄向一個地址中存儲(實際上它逐位元組地複製了所有域的數據到這個地址,包括所有的‘\0’,所有我們需要一個域大小相同的結構體來將記錄分割到幾個域,域的值可以通過使用點號(.)來直接讀取)。
用戶可以通過兩種方式讀取記錄,一種是直接讀取,另一種是順序瀏覽。
a.直接讀取
直接讀取允許用戶讀取一個被RIDFLD指定的記錄,例如通過索引(int value=array[2])獲取一個數組中的值。
語法
READ FILE(“<FD entry >”) INTO(<targetAddress>) RIDFLD(<recordIndex>)
選項
<FD entry> : 想要讀取的文件的FD名稱
<targetAddress> : 指定存儲記錄數據的地址。大多數情況下,使用之前為文件準備的結構體的地址。
<recordIndexx> : 它應該是一個指定你想要讀取的記錄的索引值的變量。注意這個變量的類型和大小應該和你在FD中指定的索引相同。
感覺有些複雜么?我們來看一個關於之前步驟的例子:
#cicsadd -c fd -r RGN1 myFile RSLKey=public BaseName=file1 IndexName=id
FileServer=”/.:/cics/sfs/OceanLinux64″ //添加一個FD,id被索引域所指定
源代碼
struct FileRecord {
char id[3];
char name[10]
char age[3]
} record; //聲明一個結構體來存儲記錄
memset(record.id,’\0′,3); //將所有位元組設置為 ‘\0’
memset(record.name,’\0′,10);
memset(record.age,’\0′,3);
char index[3]=”3″; //指定id=3的記錄將被讀取,注意大小和類型
EXEC CICS READ FILE(“myFile”) INTO(&record) RIDFLD(index);
fprintf(stderr,”Read result:\n”); //數據將會寫入console.nnnnnn文件中,只適用於測試,實際編程中不推薦
fprintf(stderr,”ID:%s\n”,record.id);
fprintf(stderr,”NAME:%s\n”,record.name);
fprintf(stderr,”AGE:%s\n”,record.age);
EXEC CICS SEND FROM(&record) LENGTH(16) ERASE; //將內容發送到終端
當使用”cicstcl“生成測試程序時,強烈推薦添加”-e -d“選項,這樣稍後用戶可以在cicslterm中使用CEDF來調試程序(見二單元)。
參閱:
關於READ命令:
關於直接讀取:
b.順序讀取
除了通過指定索引讀取記錄,TXSeries還允許我們只需指定一次RIDFLD就能重複地瀏覽記錄。
在開始讀取記錄之前,首先應該通過STARTBY設置一個開始點。
語法
STARTBR FILE(“<FD entry>”) RIDFLD(<recordIndex>)
之後就可以使用READNEXT來一個接一個地從指定的/當前的索引讀取記錄。
語法
READNEXT FILE(“<FD entry>”) INTO(<targetAddress>) RIDFLD(<recordIndex>)
READNEXT可以從目標地址讀取下一條記錄,recordIndex的值將會更新為當前記錄的索引。如果讀操作到達文件結尾,這條命令將會返回”ENDFILE“。
也可以使用READPREV從指定的/當前的索引向後讀取記錄。
語法
READPREV FILE(“<FD entry>”) INTO(<targetAddress>)
RIDFLD(<recordIndex>)
和READNEXT相似,READPREV也可以將targetAddress更新為新記錄的數據,並使用當前的索引更新recordIndex的值。如果讀操作到達文件開頭,這條命令會返回”ENDFILE“。
如果READNEXT首先執行,然後READPREV再執行,一條記錄會被讀取兩次,反之亦然。
有時用戶可能想要通過RESETBR重設開始點。
語法
RESETBR FILE(“<FD entry>”) RIDFLD(<recordIndex>)
之後開始點就會被重設為recordIndex的值。
在所有瀏覽操作完成後,用戶應該通過ENDBR來結束文件的瀏覽從而避免意外錯誤。
語法
ENDBR FILE(“<FD entry>”)
這是關於文件瀏覽用戶所需要知道的所有命令。下面將展示一個順序瀏覽的例子。
示例數據:
瀏覽操作:
參閱:
關於順序讀取:
關於STARTBR:
關於READNEXT:
關於READPREV:
以下文章點擊率最高
Loading…

