c - 为什么我的数据没有完全添加到我的阵列中?
问题描述
我正在尝试使用 strtok 从 CSV 文件 output.csv 中获取数据,然后将其打印出来。但是,当我打印出来时,它似乎将最后一个数据点分成 2 个条目,第二个被放入数组的下一个条目中。
time,identifier,x,y,z
2000.123,A123,2.849,0.34,-0.543
2001.456,A123,3.493,0.19,-0.987
2001.735,A123,5.403,1.587,0.579,-0.254
我正在读取数据并使用结构和数组来存储它。
struct Data {
double Time_Data;
char* ID;
double X_Data;
double Y_Data;
double Z_Data;
};
int main(int argc, char *argv[]){
char* field;
char line[50];
struct Data dataPoints[3567];
FILE * pointer;
fpointer = fopen("output.csv", "r");
if(fpointer == NULL){
printf("Unable to open file \n");
return 0;
}
int LineCount = 0;
while(fgets(line, 30, fpointer) != NULL){
field = strtok(line, ",");
dataPoints[LineCount].Time_Data = atof(field);
field = strtok(NULL, ",");
field = strtok(NULL, ",");
dataPoints[LineCount].X_Data = atof(field);
field = strtok(NULL, ",");
dataPoints[LineCount].Y_Data = atof(field);
field = strtok(NULL, ",");
dataPoints[LineCount].Z_Data = atof(field);
LineCount++;
}
fclose(fpointer);
printf("%lf %lf %lf %lf\n", dataPoints[0].Time_Data,
dataPoints[0].X_Data,dataPoints[0].Y_Data, dataPoints[0].Z_Data);
printf("%lf %lf %lf %lf\n", dataPoints[1].Time_Data,
dataPoints[1].X_Data,dataPoints[1].Y_Data, dataPoints[1].Z_Data);
printf("%lf %lf %lf %lf\n", dataPoints[2].Time_Data,
dataPoints[2].X_Data,dataPoints[2].Y_Data, dataPoints[2].Z_Data);
printf("%lf %lf %lf %lf\n", dataPoints[3].Time_Data,
dataPoints[3].X_Data,dataPoints[3].Y_Data, dataPoints[3].Z_Data);
printf("%lf %lf %lf %lf\n", dataPoints[4].Time_Data,
dataPoints[4].X_Data,dataPoints[4].Y_Data, dataPoints[4].Z_Data);
printf("%lf %lf %lf %lf\n", dataPoints[5].Time_Data,
dataPoints[5].X_Data,dataPoints[5].Y_Data, dataPoints[5].Z_Data);
return 0;
}
问题是由于某种原因 Z_Data 被拆分为 2 并移动到数组中的下一个条目。我得到的输出是
0.000000 0.000000 0.000000 0.000000
2000.123000 2.849000 0.340000 -0.500000
43.000000 0.000000 0.000000 0.000000
2001.456000 3.493000 0.190000 -0.900000
87.000000 0.000000 0.000000 0.000000
2001.735000 5.403000 1.587000 0.500000
我不确定为什么会这样。
解决方案
CSV 文件每行的长度为:
time,identifier,x,y,z : 21 chars
2000.123,A123,2.849,0.34,-0.543 : 31 chars
2001.456,A123,3.493,0.19,-0.987 : 31 chars
2001.735,A123,5.403,1.587,0.579,-0.254 : 38 chars
您指定30
为 的缓冲区大小fgets()
。该值不足以读取数据线。
该值应该是sizeof(line)
因为您分配了 50 个字符,line
并且应该避免使用幻数。
推荐阅读
- javascript - 检查此 javascript 以制作 meme
- r - R:用数据填充数据框并将值匹配到正确的日期
- python-2.7 - 'else' 出现意外语法错误,而代码似乎正确
- latex - 乳胶中的 github 徽标
- ios - How to detect a UIScrollView has finished scrolling when animation is false?
- c - `initgroups` 如何调用 `setgroups` 为用户初始化补充组 ID 列表?
- ios - jonkykong 的 SideMenu - 从右侧滑入
- r - 如何创建合适的 geom_boxplot?
- node.js - Mongoose 以 ddmmyyyy 格式保存日期
- python - Python,从循环中删除具有特定键的 JSON 元素