Подсчет количества строк в файле на C

Я пишу функцию, которая считывает количество строк в заданной строке. Некоторые текстовые файлы могут не заканчиваться символом новой строки.

int line_count(const char *filename)
{
   int ch = 0;
   int count = 0;    
   FILE *fileHandle;

   if ((fileHandle = fopen(filename, "r")) == NULL) {
      return -1;
   }

   do {
      ch = fgetc(fileHandle);
      if ( ch == '\n')
         count++;
   } while (ch != EOF);

   fclose(fileHandle);

   return count;
}

Теперь функция неправильно считает количество строк, но я не могу понять, в чем проблема. Буду очень признателен за вашу помощь.


person caddy-caddy    schedule 20.04.2015    source источник
comment
неправильно подсчитывает количество строк - уточните....   -  person Karoly Horvath    schedule 20.04.2015
comment
когда есть файл с 1 строкой, функция возвращает 0.   -  person caddy-caddy    schedule 20.04.2015
comment
Если вы просто отключаетесь на 1, когда нет завершающей новой строки, вам нужно будет отслеживать, что такое предыдущий символ (например, символ перед EOF) и добавить 1, если это не новая строка.   -  person pens-fan-69    schedule 20.04.2015


Ответы (2)


fgets() читает до символа новой строки или до заполнения буфера

char buf[200];
while(fgets(buf,sizeof(buf),fileHandle) != NULL)
{
  count++;
}

fgetc() является проблемой здесь, потому что вы сначала встречаете EOF и выходите из цикла do while и никогда не встречаете символ \n, поэтому count остается нетронутым для последней строки в вашем файле. Если это произойдет, в вашем файле есть одна строка, которую count быть 0

person Gopi    schedule 20.04.2015
comment
а если две строки, а не одна? - person Karoly Horvath; 20.04.2015
comment
@KarolyHorvath Опять мы видим ту же проблему !! Вот почему я предложил fgets() - person Gopi; 20.04.2015

Вот еще один вариант (кроме отслеживания последнего символа перед EOF).

int ch;
int charsOnCurrentLine = 0;

while ((ch = fgetc(fileHandle)) != EOF) {
    if (ch == '\n') {
        count++;
        charsOnCurrentLine = 0;
    } else {
        charsOnCurrentLine++;
    }
}
if (charsOnCurrentLine > 0) {
    count++;
}
person pens-fan-69    schedule 20.04.2015