_Ropen () -打开 I/O 操作的记录文件

格式

#include <recio.h>

_RFILE *_Ropen(const char * filename, const char * mode, ...);

语言级别

ILE C 扩展

线程安全

描述

_Ropen() 函数根据 mode 参数打开由 filename 指定的记录文件,如果在 mode 参数中指定了 varparm 关键字参数,那么可以后跟可选参数。 打开方式和关键字参数可以用逗号和一个或多个空格分隔。 _Ropen() 函数不会为您动态创建数据库文件。 _Ropen() 函数中引用的所有文件都必须存在,否则打开操作将失败。

_Ropen() 函数打开的文件将在其打开所在的激活组结束时隐式关闭。 如果指向在一个激活组中打开的文件的指针传递到另一个激活组并结束该打开激活组,那么该文件指针将不再有效。

_Ropen() 函数适用于所有类型的文件。 filename 变量是任何有效的 IBM® i 系统文件名。

mode 参数指定为文件请求的访问类型。 它包含后跟可选关键字参数的打开方式。 mode 参数可以是下列其中一个值:
方式
描述
rr
打开现有文件以读取记录。
世界
打开现有文件以写入记录。 如果文件包含数据,那么将清除内容,除非该文件是逻辑文件。
ar
打开现有文件以将记录写入文件末尾 (追加)。
RR +
打开现有文件以读取,写入或更新记录。
Wr +
打开现有文件以读取,写入或更新记录。 如果文件包含数据,那么将清除内容,除非该文件是逻辑文件。
阿尔 +
打开现有文件以读取和写入记录。 所有数据都将写入文件末尾。
mode 可以后跟下列任何关键字参数:
关键词
描述
arrseq=value
其中 value 可以是:
Y
指定按到达顺序处理文件。
N
指定使用创建文件时使用的访问路径来处理该文件。 这是缺省情况。
blkrcd=
其中 value 可以是:
Y
执行记录分块。 操作系统为您确定最有效的块大小。 此参数对数据库, DDM ,软盘和磁带文件有效。 它仅对针对仅输入或仅输出 (方式 rr , wr 或 ar) 打开的文件有效。
N
不执行记录分块。 这是缺省情况。
ccsid=
指定用于文件转换的 CCSID。 缺省值为 0 ,指示使用作业 CCSID。
commit=
其中 value 可以是:
Y
指定在落实控制下打开数据库文件。 在此之前必须已设置落实控制。
N
指定在落实控制下不打开数据库文件。 这是缺省情况。
dupkey=value
value 可以是:
Y
将在 _RIOFB_T 结构中标记重复的键值。
N
将不会标记重复的键值。 这是缺省情况。
指示符 =value
指示符对打印机,显示和 ICF 文件有效。 value 可以是:
Y
与该文件关联的指示符将在单独的指示符区域中返回,而不是在 I/O 缓冲区中返回。
N
这些指示符在 I/O 缓冲区中返回。 这是缺省情况。
insertkeyfb=
其中 value 可以是:
Y
指定为使用 arrseq = N 进行写入而打开的键控文件请求插入键反馈。 这是缺省情况。
N
指定不请求插入键反馈。
注意: 如果应用程序在写入后从未引用 _RIOFB_T 结构的关键字段,那么指定 insertkeyfb = N 可以在写入时获得更好的性能。 当最后一个 I/O 操作正在写入时,如果指定了 insertkeyfb = N ,那么 _Rupfb () 函数将不会使用有关此写入操作的信息来更新 _RIOFB_T 结构。
keyfb=
其中 value 可以是:
Y
指定为使用 arrseq = N 进行读取而打开的键控文件请求读取键反馈。 这是缺省情况。
N
指定不请求读取密钥反馈。
注: 如果应用程序从未引用 _RIOFB_T 结构的关键字段,那么指定 keyfb = N 可产生更好的性能。 当上次 I/O 操作正在读取时,如果指定了 keyfb = N ,那么 _Rupfb () 函数将不会使用有关此读取操作的信息来更新 _RIOFB_T 结构。
lrecl=value
固定长度记录的长度 (以字节计) 和可变长度记录的最大长度。 此参数对软盘,屏幕,打印机,磁带和保存文件有效。
nullcap=
其中 value 可以是:
Y
程序能够处理记录中的空字段。 这对数据库和 DDM 文件有效。
N
程序无法处理记录中的空字段。 这是缺省情况。
riofb=
其中 value 可以是:
Y
任何返回指向 _RIOFB_T 结构的指针的 I/O 操作都会更新 _RIOFB_T 结构中的所有字段。 但是,使用 _Rreadk 函数时,不会更新 blk_filled_by 字段。 这是缺省情况。
N
仅更新 _RIOFB_T 结构中的 num_bytes 字段。
rtncode=
其中 value 可以是:
Y
使用此选项可绕过异常生成和处理。 这将提高文件结束和未找到记录的案例中的性能。 如果迂到文件结束符,那么 num_bytes 将设置为 EOF ,但不会生成 errno 值。 如果找不到任何记录,那么 num_bytes 将设置为零, errno 将设置为 EIORECERR。 此参数仅对数据库和 DDM 文件有效。 对于 DDM 文件,不会为 _Rfeod 更新 num_bytes。
N
对于文件结束和未找到记录的情况,将发生正常的异常生成和处理过程。 这是缺省情况。
secure=value
其中 value 可以是:
Y
保护文件不受覆盖。
N
不保护文件不受覆盖。 这是缺省情况。
share=
该行为被 OVRDBF 命令的 SHARE 值覆盖。 其中 value 可以是:
Y
将打开文件以进行共享处理。
N
将打开文件,但不用于共享处理。 这是缺省情况。
splfname = (value)
仅用于假脱机输出。 其中值可以是:
*文件
打印机文件的名称用于假脱机输出文件名。
假脱机文件名
指定假脱机输出文件的名称。 最多可以使用 10 个字符。
usrdta = (value)
仅对假脱机输出指定标识文件的用户指定数据。
user-data
指定最多10个字符为用户指定文本。
varparm = (list)
其中 (list) 是可选关键字的列表,指示将哪些可选参数传递到 _Ropen()。 列表中关键字的顺序指示可选参数将在 mode 参数之后显示的顺序。 以下是有效的可选关键字:
LVLCHK
lvlchk 关键字与 #pragma mapinc 上的 lvlchk 选项结合使用。 使用此关键字时,必须在 _Ropen() 函数的方式参数之后指定指向类型为 _LVLCHK_T (由 #pragma mapinc 生成) 的对象的指针。 有关此指针的更多详细信息,请参阅 ILE C/C++ Programmer 's Guide中 #pragma mapinc 的 lvlchk 选项。
vlr=
可变长度记录,其中 value 是要写入文件的记录的最小字节长度。 该值可以等于 -1,也可以从 0 到文件的最大记录长度。 此参数对数据库和 DDM 文件有效。

需要 VLR 处理时, _Ropen() 将设置 min_length 字段。 如果未使用缺省值,那么用户提供的最小值将直接复制到 min_length 字段中。 如果指定了缺省值,那么 _Ropen() 将从开放式数据路径的数据库部分获取最小长度。

返回值

如果成功打开文件,那么 _Ropen() 函数将返回一个指向 _RFILE 类型结构的指针。 如果打开文件失败,那么将返回 NULL。

errno 的值可以设置为:
含义
EBADMODE
指定的文件方式无效。
EBADNAME
指定的文件名无效。
ECONVERT
发生转换错误。
ENOTOPEN
文件未打开。
EIOERROR
发生了不可恢复的I/O错误。
EIORECERR
发生了可恢复的I/O错误。
请参阅 表 1表 1 以获取 errno 设置。

示例

#include <stdio.h>
#include <stdlib.h>
#include <recio.h>
 
int main(void)
{
    _RFILE      *fp;
 
    /* Open the file for processing in arrival sequence.             */
    if (( fp = _Ropen ( "MYLIB/T1677RD1", "rr+, arrseq=Y" )) == NULL )
    {
        printf ( "Open failed\n" );
        exit ( 1 );
    }
    else
    /* Do some processing */;
 
 
    _Rclose ( fp );
}

相关信息