也许这个桥可能已经被多次穿越,并且在很多方面......读取一个简单的文本.conf文件并根据它的条目进行操作。解析c文件中的.conf文件
在我的情况下,该文件格式很简单..一系列令牌和分配,如:
token_name_1 value
用制表符作为字段分隔符和Unix行结束的每个记录。
.conf文件直接更改某些程序配置,它们全部存储在单个结构中。类型的变量Integer,float,char []和* char在结构中表示。
快速而枯燥的方法包括,例如:
if (strcasecmp(token,"token_name_1")==0)
token_name_1=value;
但我确定,这将是甜做契在一个不错的紧凑循环。在C.
所以最好构建一个数组,它提供了指向我希望公开的每个结构变量的指针;另一个提供变量的名称;和第三个描述存储的数据类型和期望的默认值。
这些看起来是这样的:
const char* allowed_tokens[] =
{
"loglevel",
"debugecho",
"errorSqlDisable",
"ClearErrorDbOnExit",
"\0" // terminates list
}
int *varpointers[] =
{
&appinfo.nLogLevel,
&appinfo.debugEcho,
&appinfo.OWFSLogLevel,
&appinfo.OWFSLogEchoToDisplay,
0 // terminates list
};
char *varDatatypes_defaults[] =
{
"I|6", // for LOG_INFO
"B|false",
"I|0",
"B|true",
"\0" // terminates list
};
环路看起来是这样的(伪):
row=0;
while (read a line of the .conf file into cLine)
{
get the token_name and value from cLine
check if allowed_tokens[row]==0 and if true, exit the loop
// example cLine= "debugecho false"
find match to "debugecho" in allowed_tokens. This provides an offset into varpointers and varDatatypes.
get the default data type and default value tokens from varDattypes_defaults[row]
Do the assignment. For example, if the data type=="I":
*varpointers[row]=atoi(value);
++row;
}
这种技术工作正常,但有两个问题。
- 将三个阵列组合成单个阵列将是优选的。这里有最佳做法吗?
- 指针数组(varpointers [])被定义为* int。我是这么做的,因为我希望它能够持有指针。但是,如果指向的变量不是整数数据类型,则警告:将触发不兼容指针类型的初始化。当然,char *和int *不能混合......所以如何才能做到这一点,以便使用单个指针数组?
我意识到我可以在C++中完成所有这些工作。这种奢侈品不是现在的选择。
如果您熟悉YAML(http://www.yaml.org/),那么可以不知道,但它可能是更好的标准配置解析方式。 – Gian