【发布时间】:2014-05-23 12:51:19
【问题描述】:
我很好奇如何编写 C 代码以灵活的方式读取输入文件。
作为一个非常简单的示例,假设我有变量 a、b、c 和 d。我可以按如下方式编写输入文件
a = 1.0
b = 5.0
c = 2.33
d = 0.9
而且,如果我声明 a、b、c 和 d 的类型为 double,我可以简单地使用
FILE *fr;
// set some default values
double a = 1.0, b = 1.0,
c = 2.0, d = 2.0;
fr = fopen("input_file.txt", "rt");
fscanf(fr, "a = %lf b = %lf c = %lf d = %lf", &a, &b, &c, &d);
printf("%f %f %f %f\n",
a, b, c, d);
读取数据。但这似乎很死板,例如a、b、c 和d 在输入文件中必须完全按照这个顺序,所以制作输入文件
a = 1.0
c = 5.0
b = 2.33
d = 0.9
不起作用,我无法为类似的东西添加 cmets
a = 1.0 // This is parameter foo, must have properties P1, P2 and P3
c = 5.0
b = 2.33
d = 0.9
当我有 20 个变量而不仅仅是 a、b、c 和 d 时,这一点尤其重要。任何使之尽可能灵活的帮助都会很棒。我在 Fortran 中使用了实现“namelist”的代码,这非常灵活,类似 C 语言的代码会很棒。
【问题讨论】:
-
请记住,除非您实现它,否则 C 变量在运行时没有名称。
-
嗨,对不起,我对此有点困惑。我声明变量
a、b、c和d并给它们一些默认值,但我希望用户修改输入文件中的值(而不是每次都重新编译) -
您可能需要一个诸如
struct VarMap { const char *name; double *data; } var_map[] = { { "a", &a }, { "b", &b }, { "c", &c }, { "d", &d }, };之类的结构来将(运行时)名称映射到不同的变量。然后,您将使用格式中的" %s = %lf"来读取名称(%s允许使用多字符名称)和值,然后搜索varmap以查找放置数据的位置。 -
@JonathanLeffler,谢谢,这看起来很有希望,但我不得不承认我并没有完全遵循所有内容。我了解您定义的结构,但我不完全了解如何使用该结构从输入文件中读取。