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"
,看看是否有帮助。
所以我正在创建一个名为 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"
,看看是否有帮助。