所以,我对C来说很陌生并在几个小时前碰到了一些我认为令人费解的事情。
我基本上正在使用C中的csv文件解析器。我已经获得了以下结构来保存csv文件中的单个值。 (例如" 5.13"或" Test1")。
struct CSV_DATA {
enum { is_int, is_float, is_char } type;
int ival;
char cval[10];
float fval;
};
内部主要是以下(注意:第40和41行是重要的):
int main()
{
struct CSV_DATA csv_data[500][50];
char buffer[1024] ;
char *record,*line;
int i = 0;
int j = 0;
FILE *fstream = fopen("iris.csv","r");
if(fstream == NULL)
{
printf("\n file opening failed ");
return -1 ;
}
while((line=fgets(buffer,sizeof(buffer),fstream))!=NULL)
{
record = strtok(line,",");
printf("%s", record);
while(record != NULL)
{
csv_data[i][j].type = is_char;
for (int k=0; k < strlen(record); k++){
csv_data[i][j].cval[k] = record[k];//record;
}
j++;
record = strtok(NULL,",");
printf("%s", record);
}
++i;
}
return 0 ;
}
此代码的要点是从csv文件中读取值并将其中的每一个存储在CSV_DATA的一个实例中。然后,我将该值存储在2d数组中,以便以后能够访问数据。
现在,这实际上将值存储到内存中。我知道因为我可以用GDB看到它们,但问题是数据在内存中偏离数组的实际索引。
以下命令:x / 200ub csv_data ...提供以下内容:
(gdb) x/200ub csv_data
0x7ffffff6b1f0: 2 0 0 0 0 0 0 0
0x7ffffff6b1f8: 53 46 49 0 0 0 0 0
0x7ffffff6b200: 0 0 0 0 0 0 0 0
0x7ffffff6b208: 2 0 0 0 0 0 0 0
0x7ffffff6b210: 51 46 53 0 0 0 0 0
0x7ffffff6b218: 0 0 0 0 0 0 0 0
同样地,x / 200ub csv_data [0]产生了与预期相同的东西。
然而,x / 200ub csv_data [1]正在查看内存中错误的索引值!!但是,我可以看到它们存储在内存中,但是数组的索引指向1..n的错误内存位置。任何建议或想法将不胜感激!
答案 0 :(得分:0)
内循环索引仅初始化一次。移动,
索引
其他想法也包含在内
j
[编辑]更正后的代码