Проблемы с простым счетчиком строк текстового файла в C
По сути, у меня есть эта функция, которая подсчитывает количество строк в текстовом файле, и это вызывает у меня головную боль. Он работает как брелок с небольшими файлами (скажем, с 50000 строк). Однако по какой-то причине я получаю ошибку ошибки сегментации, когда пытаюсь сосчитать строки в файле, который содержит 1 миллион строк. Это код:
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);
}
2 ответа
Это проблема
int X[X_len][4];
Если X_len больше 1000000, у вас недостаточно памяти для массива (стека).
Попробуйте вместо этого динамическое распределение (куча)
int (*X)[4];
X = malloc(X_len * sizeof *X);
if (X == NULL) /* error */;
// ...
free(X);
Я бы сказал, что проблема здесь:
int X[X_len][4];
это выделяет память в стеке, который, вероятно, составляет всего 4 МБ, что объясняет сбой после 1 000 000 строк.
Я предлагаю разместить его в куче:
int *X = (int*)malloc(X_len * sizeof(int) * 4);