c-从txt文件遍历字段会导致分段错误

时间:2019-12-06 14:51:21

标签: c pointers field fopen fread

因此,我正在创建一个名为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文件的屏幕截图。红线表示我要查找的总和。

enter image description here

1 个答案:

答案 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(),看看是否有帮助。