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