gpt4 book ai didi

c - 如何为 C 读取数据构造一个好的/灵活的输入文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:17 24 4
gpt4 key购买 nike

我很好奇如何编写 C 代码以灵活的方式读取输入文件。

作为一个非常简单的例子,假设我有变量abcd。我可以写一个输入文件如下

 a = 1.0 
b = 5.0
c = 2.33
d = 0.9

并且,如果我将 abcd 声明为 类型双,我可以简单地使用

 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);

读取数据。但这看起来很死板,例如 abcd 必须完全按照这个顺序输入文件,所以制作输入文件

 a = 1.0 
c = 5.0
b = 2.33
d = 0.9

不起作用,我不能为类似的东西添加评论

 a = 1.0   // This is parameter foo, must have properties P1, P2 and P3
c = 5.0
b = 2.33
d = 0.9

当我有 20 个变量而不仅仅是 abcd< 时,这尤其重要。任何使它尽可能灵活的帮助都会很棒。我在 Fortran 中使用了实现“名单”的代码,这非常灵活,类似于 C 中的代码会很棒。

最佳答案

转移和扩展评论。

您似乎需要这样的结构:

struct VarMap
{
const char *name;
double *data;
} var_map[] =
{
{ "a", &a }, { "b", &b },
{ "c", &c }, { "d", &d },
};

将(运行时)名称映射到不同的变量。然后,您将在格式中使用 "%s = %lf" 来读取名称(%s 允许多字符名称)和值,然后搜索varmap 以查找放置数据的位置。

enum { NUM_VARS = sizeof(varmap) / sizeof(varmap[0]) };

char name[10];
double value;

if (fscanf(fr, "%9s = %lf", name, &value) == 2)
{
int i;
for (i = 0; i < NUM_VARS; i++)
{
if (strcmp(name, varmap[i].name) == 0)
{
*varmap[i].data = value;
break;
}
}
if (i == NUM_VARS)
{
fprintf(stderr, "Failed to find match for '%s = %g'\n", name, value);
...other error handling?...
}
}

很明显,如果你有大量变量,你会想用二进制搜索或什至是基于散列的名称搜索来思考,你会将搜索抽象为一个函数而不是像上面的代码一样内联编写它。

varmap 的初始化器有一个限制——在大多数情况下,名称和指向的变量在编译时是固定的。另一种机制是使用命名变量数组:

struct NamedVar
{
const char *name;
double value;
};

您可以在结构中使用固定大小的 char 数组,或者将名称设为灵活的数组成员。

struct NamedVar
{
double value;
char name[];
};

然后您可以动态分配 struct NamedVar 值,将指向它们的指针保存在数组中,根据需要添加新的命名变量。

您需要一个函数 double named_variable(const char *name) 来获取值,以及 void set_named_variable(const char *name, double value) 来设置值(value)。哪种方法最好取决于谁可以设计变量名以及您必须处理多少变量名。对于 4 个变量或 40 个变量,struct VarMap 方法是合理的;对于 400 个变量或 4000 个变量,它确实没有意义,struct NamedVar 方法可能更好。

关于c - 如何为 C 读取数据构造一个好的/灵活的输入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23829765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com