c - 遍历 txt 文件中的字段导致分段错误

c - iterating through field from txt file causes segmentation fault

所以我正在创建一个名为 convert.c 的程序,它从一个 csv 文件中获取数据并将数据写入一个名为 data.bin 的新文本文件(但对原始 csv 文件进行了更改) .一个 field/column 的 csv 文件特别包含一列整数,这些整数被写入 data.bin 文件。在我的 analyzeInjuries.c 文件中,我试图编写一个程序来读取 data.bin 文件并计算该特定列中的整数总数(代表飓风造成的伤害总数)。

我在 convert.c 文件中计算了受伤总数,并在终端中打印出来。它起作用了,但是当我尝试在 analyzeInjuries 文件中执行相同操作时,它打印出 0 值。我不确定为什么会发生这种情况,因为 getfield 函数和计算在 convert.c 中运行良好。

我认为 char *two = getfield(buf, 2); 这一行有问题因为当我尝试打印字段二中的所有值时,它会导致分段错误。对此的任何帮助将不胜感激。我真的很困惑 analyzeInjuries.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文件的截图。红线表示我要求和的字段。

我假设 "printing third field causes seg fault" 你的意思是尝试打印 second 变量。

getfield() returns NULL 如果它没有找到字段并且因为它使用 , 作为分隔符而你的 data.bin 不使用 ,,那么它总是 return 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 看起来可能使用制表符而不是 , 作为分隔符。您可以在调用 strsep() 时将 "," 更改为 "\t",看看是否有帮助。