基本上,我有这个函数来计算文本文件中的行数,这让我很头疼。对于小文件(比如50000行),它非常有效。然而,由于某种原因,当我试图计算一个有100万行的文件中的行数时,我得到了一个分段错误。这是代码:
int countlines(char *filename)
{
// count the number of lines in the file called filename
FILE *fp = fopen(filename,"r");
int ch=0;
int lines=0;
if (fp == NULL)
return 0;
while ((ch = fgetc(fp)) != EOF)
{
if (ch == 'n')
lines++;
}
fclose(fp);
return lines;
}
老实说,我已经尝试了一千种不同的方法,但我不知道是哪里出了问题。它达到了1000000的行数,但它给了我一个分割错误。任何帮助将非常感激!
编辑:既然每个人都说它对他们有效,我将向你展示我在main函数中有什么。
int main(int argc, const char * argv[])
{
int X_len = countlines("/homes/myworkspace/X.txt");
int X[X_len][4];
printf("n X_len = %d",X_len);
}
这就是问题所在
int X[X_len][4];
当X_len大于1000000时,(堆栈)数组没有足够的内存。
尝试动态分配(heap)代替
int (*X)[4];
X = malloc(X_len * sizeof *X);
if (X == NULL) /* error */;
// ...
free(X);
我想说问题在这里:
int X[X_len][4];
这将在堆栈上分配内存,可能只有4MB,这将解释在1 000 000行后失败的原因。
我建议把它分配到堆上:
int *X = (int*)malloc(X_len * sizeof(int) * 4);