因此,我正在创建一个名为convert.c的程序,该程序从csv文件中提取数据并将数据写入新的名为data.bin的文本文件中(但对原始csv文件进行了更改)。 csv文件的一个字段/列特别包含一列整数,这些整数已写入data.bin文件。在我的analyticsInjuries.c文件中,我试图编写一个程序来读取data.bin文件,并计算该特定列中的整数总数(代表飓风造成的伤害总数)。
我在convert.c文件中计算了受伤总数,并将其打印在终端上。它确实有效,但是当我尝试在analyserInjuries文件中执行相同操作时,它打印的值为0。我不确定为什么会发生这种情况,因为在convert.c中getfield函数和计算工作正常。
我相信char * two = getfield(buf,2)行有问题。因为当我尝试打印第二个字段中的所有值时,会导致分段错误。任何帮助,将不胜感激。对于analyzerInjuries.c文件出了什么问题,我真的很困惑。
analyzeInjuries.c:
int numDisast= 0;
while (fgets (buf, lineCount, fd)) {
char *second = getfield (buf, 2); //printing second field causes seg fault
int field = POINTER2INT(second);
numDisast = numDisast + field;
}
printf("%d\n", numDisast);
return 0;
}
下图是data.bin文件的屏幕截图。红线表示我要查找的总和。
答案 0 :(得分:1)
我认为通过“打印第三个字段会导致段错误”,您的意思是尝试打印second
变量。
getfield()
如果找不到字段并且因为它使用,
作为分隔符并且您的data.bin
不使用,
,则返回NULL。始终返回NULL。然后,当您尝试打印它时,它将崩溃。
此外,您实际上并不是对列中的值求和。您的POINTER2INT
宏不会将字符串转换为整数。您可能想改用atoi()
。
编辑
首先:您应该在循环中检查NULL:
char *second = getfield (buf, 3);
if (second) {
printf("found field: %s\n", second);
numDisast = numDisast + atoi(second);
}
else {
printf("field not found\n");
}
第二:您的data.bin
看起来可能使用制表符而不是,
作为分隔符。您可以在调用","
的过程中将"\t"
更改为strsep()
,看看是否有帮助。