如何使用最less的代码行将C结构存储在可读的文件中?

我有一个科学仪器的守护进程,需要坚持大约100个独特的variables。 目前,这些设置以二进制forms存储在显式地址处,并且每个设置都使用唯一的getter和setter来访问。 这是完全无法维护的。 我想用合理的结构将设置分组在一起,并将这些结构保存到文件中。 如果文件不完整,我也会有默认值。 什么库或技术将允许我用尽可能less的代码行来保存和恢复这些结构?

序列化C结构的最快/最简单的方法是使用X宏。 这使您可以将相关属性定义在一起并重新使用元素。 这个例子没有做任何应该完成的错误检查,但是如果实现少于30行,将很难找到更短的一个。 更精细的用途是可能的,例如自动创建getter和setter。

#include <stdio.h> #define SETTINGS_TABLE \ X(float, "%f", foo, 2.71818) \ X(float, "%f", bar, 0.70711) \ X(int, "%i", baz, 42) #define X(type, fmt, name, default) type name ; struct Settings { SETTINGS_TABLE }; #undef X #define X(type, fmt, name, default) default , struct Settings settings = { SETTINGS_TABLE }; #undef X void dump(FILE *f) { #define X(type, fmt, name, default) fprintf(f, "%s=" fmt "\n", #name, settings.name); SETTINGS_TABLE #undef X } void load(FILE *f) { #define X(type, fmt, name, default) fscanf(f, #name "=" fmt, &settings.name); SETTINGS_TABLE #undef X } int main(int argc, char *argv[]) { FILE *cfg; cfg = fopen(argv[1], "r"); load(cfg); fclose(cfg); dump(stdout); return 0; } 

如果你想要人类可读的文件,你不能简单地使用库来序列化它们。 你需要写一个函数,给定一个文件名和结构,将结构的内容写入文件中。我建议你使用一行=一个成员的基础,但是也要写成员的名字,所以你会发现哪些成员失踪,这样: name:value
然后,另一个函数将需要从文件中检索一个结构。 而不是写你自己的格式,你可以使用JSON和jansson库。 **编辑:正如评论所说, libjson是另一种选择,可用于C和C + +。

“最短”有几个含义

  • 快速处理
  • 尽可能地少吃记忆
  • 方便快捷的编码

我会建议使用一个简单的文本格式序列化他们,可能是JSON (或者也许YAML或XML)。 这种格式的优点是,它们仍然以某种方式人类“可读”(最后是程序员)。

有很多的JSON库(特别是在C和C + +): jansson在C, jsoncpp为C + +等等等等…

你的科学仪器是否只运行一个微小的8位控制器? 如果是的话,你可能会受到代码大小的限制…

我也建议将文件格式化。