<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…