我正在为客户端开发API。他们想在CVI环境中为他们的项目。它本质上是一个解析器。因此,我们的目标是创建一个.h和.C文件,其中包含一个可以调用的函数,以便它们可以解析文件并读取.csv文件中的每个元素。每一行都将被分隔并放置在结构中的变量中,该结构是结构数组中的元素。
我开发了这个功能。现在我想让函数处理两个参数:一个存储有文件路径字符串的数组,以及要读取的行数。
所以它本质上是一个具有void类型的函数。
void ParseConfigFile(char filepath[], int LinesToRead);
我在头文件中定义了struct decleration。
然后我宣布:
struct TestStep TestSteps[500];
在调试过程中,我只能使用以下格式在函数底部打印:
TestSteps[LineNumber].StructElement
容易。
如何将其转换为可以使用上面显示的参数调用的函数并返回结构数组,以便用户可以调用:
TestSteps[LineNumber].StructElement
我希望这不会令人困惑。
提前致谢!
答案 0 :(得分:0)
我看到了从文件中获取数据的两种可能方法。
第一个是让客户端提供结构数组。然后将该数组及其长度传递给函数。该函数可能无法填充整个数组,可能是因为条目较少或者文件无法打开。返回数组的实际长度或错误指示符,通常为-1
:
int read_config(const char *filepath,
struct config cfg[], int max_cfg);
并将其称为:
struct config cfg[MAX_CONFIG];
int n;
n = read_config("my.config", cfg, MAX_CONFIG);
if (n > 0) {
// configure!
}
这可能接近你的"行阅读"方法
第二种方法是返回函数在malloc
和/或realloc
堆上分配的配置列表:
struct config *new_config(const char *filepath);
然后,您必须找到一种方法来表示读取了多少配置。您可以使用sentinel值执行此操作,通常在您的某个struct字段中使用NULL
指针。或者,您可以将此信息写入用户必须提供的变量:
struct config *new_config(const char *filepath, size_t &nconfig);
由于此信息已分配,因此用户必须free
。典型的用例是:
struct config *cfg;
size_t n;
cfg = new_config("my.config", &n);
if (cfg) {
// configure!
free(cfg);
}
这种方法更灵活,因为它允许任意数量的配置设置。但是编码和使用起来有点困难。