本文給出一個MacOS操作系統中的消息類的使用過程示例(結合gencat命令,<nl_types.h>頭文件以及catopen,catgets,catclose3個函數)
首先根據對應的操作系統,查看gencat命令
man gencat
可以詳細看到其中對于輸入文件(消息文件,假設該文件名為msg)的要求($set后面的是集合號,消息前面的是序號,“Hello msg1.1”是消息)。給出一個示例:
$set 1
1 Hello msg1.1
$set 2
1 Hello msg2.1
$set 3
2 Hello msg3.2
$set 4
3 Hello msg4.3
執行gencat命令生成對于的二進制格式的數據庫文件:
gencat msg.cat msg
生成一個數據庫文件msg.cat
順手擼一個用來讀取該 msg.cat 文件的示例:
// catgets.cpp#include <nl_types.h>
#include <iostream>
#include <string.h>
#include <unistd.h>/*** 1. 編輯一個catalog文件(例如 msg 文件,詳見 man gencat)*
$set 1 這是集合1
1 Hello msg1.1
$set 2 這是集合2
1 Hello msg2.1
$set 3
2 Hello msg3.2
$set 4
3 Hello msg4.3* 2. 使用gencat命令: gencat <out-file> <in-file>* 3. gencat msg.cat msg*/int main(int argc, char* argv[]) {if (argc != 2) {std::cout << "./catgets <catalog-file>" << std::endl;return 0;}// /Users/tao/Code/C/vscode/nl_types/msg.catnl_catd c = catopen(argv[1] /* 由gencat生成 */, NL_CAT_LOCALE);if (c == (nl_catd)-1) {std::cerr << "catopen error: " << strerror(errno) << std::endl;exit(-1);}for (;;) {int set;int num;std::cout << "input:<set> <num>" << std::endl;std::cin >> set;std::cin >> num;char* msg = catgets(c, set, num, "default msg");std::cout << "msg: " << msg << std::endl;}int res = catclose(c);if (res == -1) {std::cerr << "catclose error: " << strerror(errno) << std::endl;exit(-1);}return 0;
}
編譯:
c++ catgets.cpp -o catgets
執行(可以看到與最上面的消息文件一致):
./catgets /Users/tao/Code/C/vscode/nl_types/msg.cat
input:<set> <num>
1 1
msg: Hello msg1.1
input:<set> <num>
2 1
msg: Hello msg2.1
input:<set> <num>
2 2
msg: default msg
input:<set> <num>
3 1
msg: default msg
input:<set> <num>
3 2
msg: Hello msg3.2
input:<set> <num>
4 1
msg: default msg
input:<set> <num>
4 2
msg: default msg
input:<set> <num>
4 3
msg: Hello msg4.3