基本上,我有这个函数来计算文本文件中的行数,这让我很头疼。它就像一个小文件的魅力(比如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的行数,但它给了我一个分段错误错误。任何帮助将不胜感激!
编辑:由于每个人都说这对他们有用,我会告诉你我的主要功能。
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);
}
答案 0 :(得分:2)
这是问题
int X[X_len][4];
如果X_len大于1000000,则(堆栈)数组没有足够的内存。
尝试动态分配(堆)而不是
int (*X)[4];
X = malloc(X_len * sizeof *X);
if (X == NULL) /* error */;
// ...
free(X);
答案 1 :(得分:0)
我想问题就在这里:
int X[X_len][4];
这会在堆栈上分配内存,这可能只有4MB,这可以解释在1 000 000行之后失败。
我建议在堆上分配它:
int *X = (int*)malloc(X_len * sizeof(int) * 4);