2016-10-22 116 views
-1

我对编程非常陌生,我试图编写代码读取“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; 
} 

我不断收到一个分段错误,我改变了很多东西,试图找出它。有人能帮我一把吗?谢谢!

+3

您的segfault最可能的原因是“numbers.tsv4”不存在,fopen返回NULL,您的代码无法检查它,并且fgetc(NULL)炸毁。附:否则,整体逻辑无论如何都会被彻底打破。它平均无法统计文件中一半的制表符。 –

+0

你是否调试过它来发现在段错误之前发生了什么? – Carcigenicate

回答

0

带有while语句的结构就是问题所在。在每次迭代开始时,您已经获得了fgetc()的下一个字符并将其分配给cur。然后在循环内if(...)声明中,通过调用新的fgetc()并将结果分配给cur来丢弃cur。因此,在下面的方式,它改变:

while ((cur = fgetc(spData)) != EOF) { 
    if (cur == '\t') { 
    size++;} 
} 

你看,当你尝试调用fgetc()两次(无论是在while(...)if(...)),你可能会得到在if(...)声明EOF。然后在while(...)声明的下一次迭代中,您尝试访问文件外的某处,这会导致分段错误。