是否有一个广泛的C库从文件中读取名称/值对?

我的程序正在读取包含设置文件的各种文本行的文本文件。 有些线路可能变得非常大。 目前缓冲区大小是4096个字符。 有些行可能会超过这个,无论是通过恶意还是由于程序中运行的各种因素。

目前的例程是相当繁琐的写,现在我想扩大文件的可能内容,这将需要更多的这种冗长的重复代码。 (这是一个设置types文件,由name value对和偶尔的段头组成,有些数值由于多重精度而需要读取为string)。

我想要的主要是读取任何长度的行没有缓冲区溢出。 我刚刚发现getline可以为我做这件事,但是天哪,为了我这个单调乏味的图书馆呢?

编辑:

我不希望被迫在名称和值之间放置一个=号,空格就足以作为分隔符。

广泛地说,我的意思是应该在stream行的Linux发行版的标准包中提供这个库。

我知道libconfig,但似乎完全符合我的要求矫枉过正。

我的建议是DIY,因为它很容易。

  • 阅读每一行
  • 计数字符,直到你的分隔符和你的分隔符
  • 分配缓冲区
  • 并用sscanf读取名称值对

    喜欢:

    sscanf(line, "%[^:]: %[^\n]", key, value);

因为你在sccanf之前计算了字符, sccanf你会安全的。

看看libini ,听起来是正确的。 这是相当古老的,并没有完全发生疯狂的发展,但如果它已经适用于你的问题,那应该没问题。

一个更新的库和其他一些好处是glib ,它有一个键值分析器API 。

我在CCAN贡献了更新的libini 分支 。 它还包含一个非常有用的字典实现以及一些简单的哈希算法。 Rusty把它放在回购站,所以我想我做了一个相当不错的工作,使其更新和修复少量小错误。

如果你通过这个树 ,你可以找到最新版本的库,它包含基本的令牌支持以及基本的事务处理支持(对于重新读取配置文件有帮助,如果有解析错误则可以恢复)。 它还包含更多更新的单元测试。

我不再主动维护fork,因为libini的原始作者再次变为活动状态,但模块在CCAN中维护。