Проблемы с простым счетчиком строк текстового файла в 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);
Другие вопросы по тегам