gpt4 book ai didi

c - 如何将 CSV 文件中的数据存储到结构中,然后返回该结构

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:26 28 4
gpt4 key购买 nike

这是我在 stack overflow 上的第一篇文章,希望有人能给我指出正确的方向。我正在编写一个 C 函数,我的目标是读取一个 csv 文件。然后将文件中的数据传递给结构数组,然后我想将其返回到 main() 中的函数调用,访问数据以供进一步使用。如何正确读取并返回完整的结构体数组?

此功能是现有 PLC 程序的附加功能,目前所有系统参数都存储在保留内存中。目标是将参数读/写到 CSV 文件以进行备份。我怀疑我在 while 循环中做错了什么,但此时无法弄清楚是什么。也可能是我没有正确使用指针。 CSV 文件如下所示:

2;motor nominal current;1700
3;motor nominal speed;2500.0
4;motor nominal power;1200.0
5;motor nominal voltage;690.0
6;Enable motor heating;TRUE
7;Motor heating time on;40.0

顺便说一句,我知道我没有释放函数中分配的内存。这将在以后进一步处理。

这是包含函数的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BSIZE 80

struct parameter{
int id;
char *name;
char *value;
};

struct parameter* readCSV(const char *file)
{
char buffer[BSIZE];
FILE *f;
char *field;

// open the CSV file
f = fopen(file,"r");
if( f == NULL)
{
printf("Unable to open file '%s'\n",file);
exit(1);
}
static struct parameter *parameters[BSIZE];

int i = 0;
// read the data
while(fgets(buffer,BSIZE,f) != NULL)
{
parameters[i] =(struct parameter*)malloc(sizeof(struct parameter));

// get id
field = strtok(buffer,";");
parameters[i]->id = atoi(field);

// get name
field = strtok(NULL,";");
parameters[i]->name = field;

// get value
field = strtok(NULL,";");
parameters[i]->value = field;

// display the result
printf("ID%d:\t%s\t%s\n",parameters[i].id, parameters[i].name, parameters[i].value);

i++;
}

//close file
fclose(f);

return *parameters;

}

int main()
{
struct parameter *parameters;

parameters = readCSV("QD_Config.csv");

printf("ID%d:\t%s\t%s\n",parameters[0]->id, parameters[0]->name, parameters[0]->value);

return(0);
}

我能够打印文件的内容,但似乎无法在传递之前正确存储结构数组。在main()中,调用该函数时,我只得到文件中的姓氏和值,但带有第一个的ID号。

最佳答案

您(可能)遇到的问题是 strtok函数返回指向您正在标记化的字符串的指针。它不会为您创建新字符串。

这意味着例如

field = strtok(NULL,";");
parameters[i]->name = field;

将使parameters[i]->name 指向buffer 中的某个字符。一旦函数 readCSV 返回变量 buffer 就结束了它的生命周期并且不再存在,留下无效的指针。

需要自己为字符串分配内存,并将数据拷贝到其中。这可以通过创建结构成员数组并使用 strcpy 将字符串复制到这些数组来完成,或者通过使用非标准但常用的 strdup 函数(分配堆的动态内存并将字符串复制到它)。


还有一个与返回结构相关的问题:

return *parameters;

等于

return parameters[0];

也就是说,您返回一个指向单个参数结构的指针。

如果你想返回整个数组,你应该这样做

return parameters;  // Return the whole array

但请注意,它会衰减到指向其第一个元素(即 &parameters[0])的指针,该元素的类型为 struct parameter **,因此您需要适当调整返回类型。

您还需要将参数初始化为空指针,否则将很难找到数组的末尾:

static struct parameter *parameters[BSIZE] = { NULL };

然而,我更推荐一个更好的解决方案,即您将数组作为参数传入,并返回您填写的元素数。然后您可以使用结构对象数组(而不是结构指针数组) 并且不必进行任何动态分配和内存泄漏风险。

关于c - 如何将 CSV 文件中的数据存储到结构中,然后返回该结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56887214/

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