我一点都不熟悉C。我只需要将数据输入到已经使用C语言开发的模型中,然后将数据放入数组中,获取输出,然后再将其输出回Python中即可。我的数据在CSV文件中,我只是想将其放入2D数组中以运行某些功能。当我运行以下代码以确保创建数组时,输出中的随机单个值与原始数据根本不匹配。有时会打印0.00000。我正在尝试查看整个数组,以确保可以输入它。
另外,这只是一个示例;我的真实数据集将具有> 3000行。我了解我在运行真实数据时需要为此使用malloc()
,对吗?
@ user3629249感谢您和@Cool Guy的所有评论。这就是我现在所拥有的。我认为sprintf()仍无法将我的数组值转换回浮点数。我搜索了所有内容,但仍然无法分辨我做错了什么,但是错误告诉我data [l] [k]和todata仍然不兼容,您能告诉我我是否在正确的轨道上以及我在做什么sprintf()函数做错了吗?
#include <stdio.h>
int main() {
FILE *fp;
fp=fopen("airvariablesSend.csv", "r");
if(fp == NULL){
printf("cannot open file\n\n");
return -1;
}
//为简单起见,删除了标题。仍然在airvariables.csv中找到,以查看哪个//列表示什么
float data[9][6]; //for putting into array
int k , l;
float num; //for using getline() function
char *memory;
int nbytes = 500;
//使用malloc的空间?这足够还是太多?
char *token; //for parsing through line using strtok()
char *search = ","; //delimiter for csv
char *todata; //for
//在堆上寻求空间
memory = (char *) malloc (nbytes + 1);
//不要;不需要使用realloc(),因为getline()会自动执行吗? // http://crasseux.com/books/ctutorial/getline.html
for(k = 0; k < 6 ; k++) //repeats for max number of columns
{
for (l=0; l< 9; l++) //modify for number of rows that you have
{
num = getline (&memory, &nbytes, fp); //reading line by line
token = strtok(num, search); //separating lines by comma in csv
//显然strtok()仅会使用空格,我也在这里收到警告。还有用逗号分隔的功能吗?
sprintf(todata, "%f", token);
data[l][k] = todata;
printf("%f\n", data[l][k]);
}
}
fclose(fp);
free(memory);
return 0;
}
最佳答案
更改
for (l=1; l< 11; l++)
至
for (l=0; l< 10; l++)
和
printf("%f\n", data[10][7]);
至
printf("%f\n", data[l][k]);
然后将
printf
data[l][k] = num;
前者之所以完成,是因为数组索引从0开始,在长度为1处结束。
这样做是因为您需要遍历数组以获取存储在数组的每个索引中的每个值并进行打印。您不能只使用
data[10][7]
并期望整个数组都能被打印出来。 data[10][7]
是无效的位置,访问它会调用未定义的行为,这意味着任何事情都可能发生,包括分段错误,运行时错误,崩溃等。另外,如果
return -1;
打开第一个参数失败,请在第一个if
主体的末尾添加一个fopen
以结束程序的执行。关于c - 将csv文件读入c中的二维数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29033712/