catopen ()- 打开消息目录

格式

#include <nl_types.h>
nl_catd catopen(const char *name, int oflag);

语言级别

XPG4

线程安全

语言环境敏感

此函数的行为可能受当前语言环境的 LC_MESSAGES 类别影响。 当在编译命令上指定 LOCALETYPE (*CLD) 时,此功能不可用。 有关更多信息,请参阅 了解 CCSID 和语言环境

集成文件系统界面

当在编译命令上指定 SYSIFCOPT (*NOIFSIO) 时,此功能不可用。

描述

catopen() 函数将打开消息目录,必须先完成此操作,然后才能检索消息。 如果在名称中找不到斜杠 (/) 字符,那么将使用 NLSPATH 环境变量和 LC_MESSAGES 类别来查找指定的消息目录。 如果该名称包含一个或多个斜杠 (/) 字符,那么该名称将解释为要打开的目录的路径名。

如果没有 NLSPATH 环境变量,或者如果在 NLSPATH 指定的路径中找不到消息目录,那么将使用缺省路径。 缺省路径可能受 LANG 环境变量设置的影响; 如果在 oflag 参数中设置了 NL_CAT_LOCALE 标志,或者如果未设置 LANG 环境变量,那么缺省路径可能受 LC_MESSAGES 语言环境类别影响。

可以为 oflag 参数指定三个值 :NL_CAT_LOCALE , NL_CAT_JOB_MODE 和 NL_CAT_CTYPE_MODE。 NL_CAT_JOB_MODE 和 NL_CAT_CTYPE_MODE 互斥。 如果 NL_CAT_JOB_MODE 和 NL_CAT_CTYPE_MODE 标志都在 oflag 参数中设置,那么 catopen () 函数将失败,返回值为 CATD_ERR。

如果希望目录消息在由 catgets() 函数返回之前转换为作业 CCSID ,请将该参数设置为 NL_CAT_JOB_MODE。 如果希望目录消息在 catgets()返回之前转换为 LC_CTYPE CCSID ,请将该参数设置为 NL_CAT_CTYPE_MODE。 如果未将该参数设置为 NL_CAT_JOB_MODE 或 NL_CAT_CTYPE_MODE ,那么将返回消息而不进行转换,并使用消息文件的 CCSID。

消息目录描述符将保持有效,直到通过调用 catclose()将其关闭为止。 如果 LC_MESSAGES 语言环境类别已更改,那么可能会使现有打开的消息目录失效。
注: 消息目录的名称必须是有效的集成文件系统文件名。

返回值

如果成功打开消息目录,那么将返回有效的目录描述符。 如果 catopen() 不成功,那么将返回 CATD_ERR ((nl_catd) -1)。

在以下情况下, catopen() 函数可能会失败,并且 errno 的值可以设置为:
EACCES
没有足够的权限来读取指定的消息目录,或搜索指定的消息目录的路径前缀的组件。
ECONVERT
发生转换错误。
EMFILE
NL_MAXOPEN 消息目录当前已打开。
ENAMETOOLONG
消息目录的路径名长度超过 PATH_MAX ,或者路径名组件的长度超过 NAME_MAX。
ENFILE
系统中当前打开的文件过多。
ENOENT
消息目录不存在,或者名称参数指向空字符串。

示例

#include <stdio.h>
#include <nl_types.h>
#include <locale.h>
 
/* Name of the message catalog is "/qsys.lib/mylib.lib/msgs.usrspc" */
 
int main(void) {
 
   nl_catd msg_file;
   char * my_msg;
   char * my_locale;
 
   setlocale(LC_ALL, NULL);
   msg_file = catopen("/qsys.lib/mylib.lib/msgs.usrspc", 0);
 
   if (msg_file != CATD_ERR)  {
 
     my_msg = catgets(msg_file, 1, 2, "oops");
 
     printf("%s\n", my_msg);
 
     catclose(msg_file);
   }
}

相关信息