我根本不熟悉C.我只需要将我的数据输入到C中已经很好开发的模型中,将数据放入数组中,获取输出并将该输出放回到我的程序中。我的数据在CSV文件中,我只是想把它放在一个二维数组中来运行一些函数。当我运行以下代码以确保我创建了我的数组时,我在输出中得到一个与原始数据完全不匹配的随机单值。有时打印0.00000。我正在尝试查看整个数组以确保它已准备好输入。
另外,这只是一个样本;我的真实数据集将有> 3000行。我知道在运行真实数据时我需要使用malloc()
,对吗?
@ user3629249谢谢你和@Cool Guy的所有评论。这就是我现在拥有的。我认为sprintf()仍然无法将我的数组值转换回浮点数。我一直在搜索,我仍然无法告诉我做错了什么但错误告诉我数据[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;
}
答案 0 :(得分:1)
更改
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
以结束程序的执行。