【问题标题】:File Config, creation and usage in C unixC unix 中的文件配置、创建和使用
【发布时间】:2018-05-16 14:25:25
【问题描述】:

我正在尝试了解如何创建一个包含一堆参数的“.config”文件,以便以后在 Unix 上的 C 项目中设置变量。

我使用sudo nano test.config 创建了我的“.config”文件并在里面写了一些东西,例如:

#N is this
N 10
#p is that
p 0.002
#T is this
T 10

既然我这样做了,我该如何读取它的内容并使用它来初始化我的变量?

【问题讨论】:

  • 发布你的尝试。
  • 打开文件,读取内容,根据需要设置变量。
  • @ChristianGibbons 就像普通的文本文件一样?
  • 文件就是文件就是文件——主要是。是的,配置文件只是一个指定为配置文件并以某种特定方式格式化的常规文本文件。看起来您的将忽略以 # 开头的行作为注释行,忽略空行(为了理智起见),并且需要一个字母数字关键字和一个值。这很容易。还有很多细节需要担心——价值部分的空间很重要;你能引用字符串或空格吗,什么名字很重要,文件中有没有部分。

标签: c unix config


【解决方案1】:

this 问题的几个答案解释了如何解析该配置文件,但您可以使用标准的 parsing 技术(可能是您自己的 recursive descent parser)或 Glib 的 lexical scanningkey-value pair parser(或使用其他东西)。您当然应该定义并记录(可能使用EBNF)该文本配置文件的format 是什么(以及其中的各种条目代表什么:例如,如果该配置文件引用其他文件,您如何处理此类文件路径中的空格等....)。一个常见的(但不是通用的)约定是将任何以 # 开头的行视为 cmets,因此请跳过任何行。

另一个问题是如何在任意working directory 中运行时获取该配置文件。您只需要构建文件的绝对路径(对于fopen(3)open(2)),例如与

char configpath[100];
snprintf(configpath, sizeof(configpath), "%s/.test.config", getenv("HOME"));

您可以在此之前测试 getenv("HOME") 不是 NULL,但实际上这非常不太可能;见environ(7)getenv(3);并且它提供非常长的文件路径的情况也不太可能;您可以测试snprintf(3) 返回的计数小于sizeof(configpath) 或使用asprintf(3)

您可以使用其他功能,例如glob(3)wordexp(3) 获取该文件路径(但您可能应该坚持使用 snprintfasprintfgetenv("HOME")...)。

您可能会考虑在您的程序中嵌入一些可编写脚本的解释器,例如 luaguile(但这是一个强有力的架构设计决策)。然后配置文件就变成了一些(图灵完备!)脚本。

顺便说一句,无需使用sudo 来编辑该配置文件(在您的主目录下),您可能还决定在/etc/ 下读取一些系统范围的配置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多