也許這個橋可能已經被多次穿越,並且在很多方面......讀取一個簡單的文本.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