在C中打开文件时出现分段错误?
问题描述:
我对编程非常陌生,我试图编写代码读取“numbers.tsv4”(.tsv4表示制表符分隔值,4表示一行)并将数字放入数组中。现在我只关注计算文件中数字的数量,所以我可以初始化数组的大小。在C中打开文件时出现分段错误?
int main(void)
{
int cur;
FILE* spData;
int size=1;
spData = fopen("numbers.tsv4", "r");
while ((cur = fgetc(spData)) != EOF) {
if ((cur = fgetc(spData)) == '\t') {
size++;}
}
fclose(spData);
printf("%d", size);
return;
}
我不断收到一个分段错误,我改变了很多东西,试图找出它。有人能帮我一把吗?谢谢!
答
带有while语句的结构就是问题所在。在每次迭代开始时,您已经获得了fgetc()
的下一个字符并将其分配给cur
。然后在循环内if(...)
声明中,通过调用新的fgetc()
并将结果分配给cur
来丢弃cur
。因此,在下面的方式,它改变:
while ((cur = fgetc(spData)) != EOF) {
if (cur == '\t') {
size++;}
}
你看,当你尝试调用fgetc()
两次(无论是在while(...)
和if(...)
),你可能会得到在if(...)
声明EOF
。然后在while(...)
声明的下一次迭代中,您尝试访问文件外的某处,这会导致分段错误。
您的segfault最可能的原因是“numbers.tsv4”不存在,fopen返回NULL,您的代码无法检查它,并且fgetc(NULL)炸毁。附:否则,整体逻辑无论如何都会被彻底打破。它平均无法统计文件中一半的制表符。 –
你是否调试过它来发现在段错误之前发生了什么? – Carcigenicate