Почему мой счетчик строк в C не работает?

Я пытаюсь прочитать текстовый файл, но перед этим я хочу узнать, сколько элементов я собираюсь прочитать. Поэтому мне нужно посчитать строки текстового файла. Пока у меня есть это:

int getLinecount (char *file) 
{
    int ch, count = 0;
    FILE *fp = fopen(file, "r");
    if(fp == NULL)
    {
        return -1;
    }
    while((ch = fgetc(fp)) != EOF)
    {
        if (ch == '\n'); 
        {
            count++;
        }
    }
    fclose(fp);
    return count;
}

Это работало довольно хорошо. Я ничего не изменил в текстовом файле, и все равно он печатает 130 000, хотя в файле только 10 000 строк. Единственное, что я написал в своем основном:

linecount = getLinecount("...");

Мне действительно любопытно, где ошибка. Кроме того, есть ли лучший вариант получения linecount?

7 ответов

Решение

У вас завершающая точка с запятой ; после вашего if заявление. Затем блок всегда выполняется:

{
    count++;
}

+ Изменить

if (ch == '\n'); 

чтобы:

if (ch == '\n')

Точка с запятой после if: убери это. С конечной точкой с запятой код эквивалентен:

if (ch == '\n') {}
count++;

означающий, что count увеличивается для каждой итерации цикла (каждый char в файле).

У вас есть конечная точка с запятой для удаления после if

и для чтения файлов лучше использовать этот код:

while((fgets(blahblahblah)) != NULL) {
  counter++;
}

Все нормально кроме точки с запятой (;), который должен быть удален из строки

if (ch == '\n')

Возможно, вы захотите рассмотреть ОС, которую вы используете для создания и просмотра этого файла.

Скопировано из PHP Echo Line Breaks:

  • '\ n' - разрыв строки в linux/unix
  • '\r' - это классический разрыв строки в mac [OS X использует вышеуказанный unix \ n]
  • '\r' + '\ n' - разрыв строки в Windows

Отдельно от ; Проблема, упомянутая другими, может найти альтернативное решение в этом посте, поскольку он объясняет, почему он делает вещи так, как он.

Другие вопросы по тегам