c - 在c中解析.conf文件

标签 c arrays parsing configuration-files variable-assignment

也许这座桥可能已经在很多方面被跨越了很多次......读取一个简单的文本 .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;
}

这种技术效果很好,但有两个问题。

  1. 最好将三个数组合并为一个数组。这里有最佳实践吗?
  2. 指针数组 (varpointers[]) 定义为 *int。我这样做是因为我希望它保存指针。但是,如果指向的变量不是整数数据类型,则会触发警告:从不兼容的指针类型进行初始化。当然,char * 和 int * 不能混合...那么如何才能使用单个指针数组来完成此操作呢?

我意识到我可以用 C++ 完成这一切。目前还无法选择这种奢侈。

最佳答案

您可以通过结构将它们组合成一个数组,例如

typedef struct { char *token; void *var; char *defaults; } the_type;

the_type the_data[] = { { "loglevel",  (void*)&appinfo.nLogLevel, "I|6" },
                        { "debugecho", (void*)&appinfo.debugEcho, "B|false" }, 
                      ... 
                      };

通用指针类型为void *。您的代码必须确保在实际写入指向的变量时使用正确的类型,例如*(int*)the_data[0] = 42;

关于c - 在c中解析.conf文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171230/

相关文章:

c++ - 如果没有文件、objdump 或 gdb,如何知道二进制文件是否包含调试符号?

c - 确定处理器的字长

c - 使用静态数组

Ruby 按日期计算项目

c# - 类型信息应该在解析树中编码吗?

javascript - 将复杂的字符串转换为整数?

c - 在 C 中显示缓冲区中的第一百组字符

arrays - 排序 d 排序数组的算法

javascript - 根据数组对象中存在的键排序

arrays - 从 R 中的另一个 3D 数组填充 3D 数组的最快方法