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

c-从txt文件遍历字段会导致分段错误,c,pointers,field,fopen,fread,C,Pointers,Field,Fopen,Fread,因此,我正在创建一个名为convert.c的程序,它从csv文件中接收数据,并将数据写入一个名为data.bin的新文本文件(但对原始csv文件进行了修改)。csv文件的一个字段/列尤其包含一列整数,这些整数被写入data.bin文件。在我的analyzeinjusts.c文件中,我试图编写一个程序,读取data.bin文件并计算特定列中的整数总数(表示飓风造成的伤害总数) 我在convert.c文件中计算了受伤总数,并将其打印到终端上。但是,当我尝试在AnalyzeInjusts文件中执行相同

因此,我正在创建一个名为convert.c的程序,它从csv文件中接收数据,并将数据写入一个名为data.bin的新文本文件(但对原始csv文件进行了修改)。csv文件的一个字段/列尤其包含一列整数,这些整数被写入data.bin文件。在我的analyzeinjusts.c文件中,我试图编写一个程序,读取data.bin文件并计算特定列中的整数总数(表示飓风造成的伤害总数)

我在convert.c文件中计算了受伤总数,并将其打印到终端上。但是,当我尝试在AnalyzeInjusts文件中执行相同操作时,它会打印一个值0。我不知道为什么会发生这种情况,因为getfield函数和计算在convert.c中运行良好

我认为行char*two=getfield(buf,2)有问题;因为当我试图打印字段2中的所有值时,它会导致分段错误。对此,我们将不胜感激。我真的很困惑analyzeinjusts.c文件中到底出了什么问题

分析伤害。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文件的屏幕截图。红线表示我试图找到的字段的总和

我假设“打印第三个字段导致seg故障”意味着尝试打印第二个变量

getfield()
如果找不到字段,并且由于它使用
作为分隔符,并且您的
数据,因此返回NULL。bin
不使用
,则它将始终返回NULL。然后,当您试图打印它时,它将崩溃

除此之外,您并不是真正对列中的值求和。您的
指针2int
宏不会将字符串转换为整数。您可能想改用
atoi()

编辑

第一:您应该在循环中检查NULL:

char*second=getfield(buf,3);
如果(秒){
printf(“找到的字段:%s\n”,第二个);
NUMDISST=NUMDISST+atoi(秒);
}
否则{
printf(“未找到字段”);
}

第二:您的
data.bin
看起来可能使用制表符而不是
作为分隔符。您可以在调用
strep()
时将
,“
更改为
”\t“
,看看是否有帮助。

请不要发布文本图片。您的问题,并将
data.bin
文件的最低版本作为文本发布。A应包括数据。但是给文本文件一个“.bin”扩展名违反了惯例。bin用于二进制数据,不能用文本编辑器有意义地显示二进制数据。很可能您不会使用
fgets
对从二进制文件中提取的数据执行读取和字符串操作。这是提供给我的文件名。我不知道为什么它叫.bin,但它基本上是一个txt文件。啊,好的。。告诉你的供应商把它组装起来!您在
getfield
的最后两行中塞进了很多功能。。将其中的一部分拆分为单独的行,使用调试器逐步执行,并查看每个操作的行为是否符合预期可能会有所帮助。很容易犯错误与缓冲区溢出与所有您的内存复制和移动。嗨!我不确定用什么来替换while循环中的逗号。我试着在getfield()中注释整行内容,并使用printf(“%d”,atoi(second));而不是指针2int,但它似乎仍然会导致seg故障。